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

问题描述 投票:0回答:4

我必须在 mongodb 上执行查询,我只想选择具有特定 _id (类型 ObjectId)的文档。
我使用“严格模式”语法,特别是运算符 $oid 来将 _id 与字符串进行比较。
但它不起作用!,我现在不知道它是否是一个错误(一包 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;
mongodb delphi mongo-c-driver
4个回答
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;

0
投票
Var FMongoConn : TMongoConnection;
begin
  FMongoConn := TMongoConnection(Connection.CliObj);
  Result := FMongoConn['DataBase'] ['collections'].Dereference(TJsonOid.Create('5EAB21D55C61623E44004B21')).AsJSON;

0
投票
procedure TForm2.Button1Click(Sender: TObject);
var oCrs  : IMongoCursor;
    Aux   : String;
begin
   oCrs := FMongoConn['DataBase']['collections'].Find()
    .Match
      .BeginObject('_id')
        .Add('$eq', TJsonOid.Create('5eab21d55c61623e44004b21'))
      .EndObject
    .&End;

  While (oCrs.Next) do
    begin
      Aux := Aux + oCrs.Doc.AsJSON;
    end;

  if Trim(Aux) = '' then
    Memo1.Text := '0'
  else
    Memo1.Text := Aux;
end;

0
投票

你能告诉我如何做同样的事情,只要集合文档的字段不是OID类型,而是UUID类型吗?如何使用Delphi驱动程序将所需UUID的值传输到服务器?我尝试了许多不同的选项,包括转换为 Base64 并将值作为 TByte 传递,但没有任何帮助。我将不胜感激任何建议。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.