首页 文章

使用mongo-delphi-driver获取具有特定_id的文档

提问于
浏览
0

我必须对mongodb执行查询,我想只选择一个具有特定_id的文档(类型为ObjectId) .
我使用"Strict mode" sintax,特别是运算符$ oid用于比较_id和一个字符串 .
但是,如果它是一个bug(一包mongo-c-driver / mongo-delphi-driver),或者如果我在ObjectId字段上编写错误的代码来查询它,那么它现在还没有 .

在简单的代码片段下面,包含该_id的文档存在但bson文档为nil

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

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 回答

  • 1

    正如here所述,严格模式JSON接口仅用于HTTP API和命令行工具 . 驱动程序应使用适当的BSON . 我想你可以在Delphi中这样做:

    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;
    

相关问题