2017-05-04 136 views
0

我必須對mongodb執行一個查詢,我想只選擇一個具有特定_id(類型爲ObjectId)的文檔。
我使用「嚴格模式」sintax,特別是運算符$ oid用於比較_id與字符串。
但它不起作用!,如果它是一個錯誤(一包mongo-c-driver/mongo-delphi-driver),或者如果我在ObjectId字段上進行查詢時編寫了錯誤的代碼,我現在不會這樣做。用mongo-delphi-driver獲取一個特定的_id文件

下面一個簡單的代碼片段,與_id該文件存在,但該BSON文件是零

var 
    b : TBson; 
    begin 
    b := mongo.findOne(ns,(BSON(['_id','{','$oid','58c6b6af9b2dcd04ae46844d','}']))); 
    if b = nil then 
     ShowMessage('No match') 
    else 
     ShowRecord(b); 
    end 

https://docs.mongodb.com/manual/reference/mongodb-extended-json/

我也嘗試用這個兩個方法...

var 
    bb : TBsonBuffer; 
    query, b : TBson; 
    cursor : TMongoCursor; 
begin 
    bb := TbsonBuffer.Create(); 
    bb.startObject('_id'); 
    bb.append('$oid', PAnsiChar('"58c6b6af9b2dcd04ae46844d"')); 
    bb.finishObject(); 

    query := bb.finish(); 
    b := mongo.findOne(ns, query); 
    if b = nil then 
    ShowMessage('No match') 
    else 
    ShowRecord(b); 
end 

and

var 
    bb : TBsonBuffer; 
    query, b : TBson; 
    id : TBsonOID; 
begin 
    id := TBsonOID.Create('58c6b6af9b2dcd04ae46844d'); 
    bb := TbsonBuffer.Create(); 
    bb.startObject('_id'); 
    bb.append('$oid', id); 
    bb.finishObject(); 

    query := bb.finish(); 
    b := mongo.findOne(ns, query); 
    if b = nil then 
    ShowMessage('No match') 
    else 
    ShowRecord(b); 
end; 

回答

1

正如它所說的here,嚴格模式JSON接口僅用於HTTP API和命令行工具。預計司機會使用適當的BSON。我認爲你可以這樣做在德爾福這樣的:

b := mongo.findOne(ns(BSON(['_id',TBsonOID.Create('58c6b6af9b2dcd04ae46844d')]))); 

但我不是一個真正的德爾福人。

編輯:您添加的TBsonOID例子應該是這樣的,我認爲:

var 
    bb : TBsonBuffer; 
    query, b : TBson; 
    id : TBsonOID; 
begin 
    id := TBsonOID.Create('58c6b6af9b2dcd04ae46844d'); 
    bb := TbsonBuffer.Create(); 
    // _id isnt a json object it is an oid. 
    bb.append('_id', id); 
    query := bb.finish(); 
    b := mongo.findOne(ns, query); 
    if b = nil then 
    ShowMessage('No match') 
    else 
    ShowRecord(b); 
end; 
+0

感謝答案,我用的比較操作符,如$ EQ或$ GT(其他領域),以及工作!問題出在ObjectId類型爲 –

+0

的字段上有所不同。查詢不是它們自己的bson類型,它們只是作爲字符串發送。 –

+0

添加回復您的編輯 –