使用 mongo-delphi-driver 获取具有特定 _id 的文档
Get a document with a specific _id with mongo-delphi-driver
我必须在 mongodb 上执行查询,我希望 select 只有文档具有特定的 _id(类型 ObjectId)。
我使用 "Strict mode" 语法,特别是运算符 $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;
正如它所说 here,严格模式 JSON 接口仅用于 HTTP API 和命令行工具。司机应该使用适当的 BSON。我想你可以在 Delphi 中这样做:
b := mongo.findOne(ns(BSON(['_id',TBsonOID.Create('58c6b6af9b2dcd04ae46844d')])));
但我不是一个真正的 delphi 人。
编辑:你添加的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;
Var FMongoConn : TMongoConnection;
begin
FMongoConn := TMongoConnection(Connection.CliObj);
Result := FMongoConn['DataBase'] ['collections'].Dereference(TJsonOid.Create('5EAB21D55C61623E44004B21')).AsJSON;
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;
我必须在 mongodb 上执行查询,我希望 select 只有文档具有特定的 _id(类型 ObjectId)。
我使用 "Strict mode" 语法,特别是运算符 $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;
正如它所说 here,严格模式 JSON 接口仅用于 HTTP API 和命令行工具。司机应该使用适当的 BSON。我想你可以在 Delphi 中这样做:
b := mongo.findOne(ns(BSON(['_id',TBsonOID.Create('58c6b6af9b2dcd04ae46844d')])));
但我不是一个真正的 delphi 人。
编辑:你添加的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;
Var FMongoConn : TMongoConnection;
begin
FMongoConn := TMongoConnection(Connection.CliObj);
Result := FMongoConn['DataBase'] ['collections'].Dereference(TJsonOid.Create('5EAB21D55C61623E44004B21')).AsJSON;
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;