2017-05-04 8 views
0

mongodbでクエリを実行する必要があります。ドキュメントには特定の_id(ObjectIdタイプ)が選択されています。
私は "厳密モード" sintaxを使用します。特に、_idと文字列を比較する場合は、演算子$ oidを使用します。
しかし、それは動作しません!、私はバグ(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/

nilである私も、この二つの方法を試してください...

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 

および

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

おかげで、私は$当量または$ GT(他のフィールド上)と、その作業のような比較演算子を使用します!問題は、異なるObjectIdタイプ –

+0

のフィールドにあります。クエリは独自のbson型ではなく、単に文字列として送信されます。 –

+0

編集に返信しました –

関連する問題