当前位置: 首页 > 知识库问答 >
问题:

使用mongo delphi驱动程序获取具有特定_id的文档

席弘图
2023-03-14

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

共有3个答案

阎宾实
2023-03-14
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;
李明贤
2023-03-14
Var FMongoConn : TMongoConnection;
begin
  FMongoConn := TMongoConnection(Connection.CliObj);
  Result := FMongoConn['DataBase'] ['collections'].Dereference(TJsonOid.Create('5EAB21D55C61623E44004B21')).AsJSON;
裘臻
2023-03-14

正如这里所说的,严格模式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;
 类似资料:
  • 我正在尝试查找一个XPath查询以获取元素的祖先,它是一个,具有。 我做错了什么?

  • 您好,我正在尝试从mongodb获取D-7天的文档 示例:如果今天是“星期三”,那么我只想获取上一个“星期三”的文档 我得到的日期从前端, 日期格式在mongob: 日期格式从邮递员:"2020-01-15"我在nodejs转换成dateObject.喜欢这个: 2020-01-15T00:00:00.000Z nodejs查询 邮递员。身体 POSTMAN响应返回空数组 Mongodb系列

  • 问题内容: 我有一个推特ID列表,我想为其下载其文本内容。有什么简单的解决方案,最好是通过Python脚本来实现?我查看了Tweepy之类的其他库,但事情似乎并没有那么简单,并且由于我的清单很长,因此无法手动下载它们。 问题答案: 您可以使用API路由按其ID访问特定的推文。大多数Python Twitter库遵循完全相同的模式,或为这些方法提供“友好的”名称。 例如,Twython提供了几种方法

  • 问题内容: 我正在尝试通过搜索“ _id”键在MongoDB中查找文档。我的文件看起来像这样- 我正在尝试将此文档搜索为- 但我得到以下错误- BasicDBObject的append方法支持(字符串键,值),如果我将“ _id”作为String传递给此方法,则不会匹配任何文档。 所以我的问题是如何传递“ _id”? 问题答案: 通过使用as作为查询来解决

  • 问题内容: 我正在尝试使用JDBC驱动程序将android应用程序连接到服务器(PostgreSQL),但是出现此错误: 我尝试了很多事情,例如在路径中添加驱动程序的地址,但没有任何效果。我遵循了本教程:http : //appliedcoffeetechnology.tumblr.com/post/10657124340,并在构建路径中添加了驱动程序JDBC4(我也尝试过JDBC3)。 每个人都

  • 我正在尝试插入一个新文档,其中_id字段在ReactiveMongo中指定。但是我所有的插入都是使用Mongo默认的增量对象ID执行的。有没有办法在插入过程中指定_id? 这是我的代码。