2

我正在使用 Node.js 构建一个使用 mongodb 的 Web 套接字服务器。

我使用 node-mongodb-native 作为库来访问 mongo db。

当我在数据库中的对象上调用 console.log(sys.inspect(item)) 时,我得到如下所示的内容:

{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' }
, y: 3
, favorite_color: 'orange'
, x: 14766
}

所以我猜测 id 是 mongo 使用的 BSON 对象 id。

我需要使用 JSON 将此对象发送到客户端 Web 浏览器,让他们对其执行一些操作,然后将其发送回服务器。

当我 JSON.stringify(item) 时,我得到如下所示的内容:

{"_id":"4c3f23268ead0e8f14050000","y":3,"favorite_color":"orange","x":14766}

所以 id 已经变成了一些十六进制编码的字符串。如果我将它发送给客户端,然后客户端将其发回,我现在需要在数据库中更新它。我运行 JSON.parse(item) 让它成为一个普通对象,但它仍然看起来像这样:

{ _id: '4c3f23268ead0e8f14050000'
, y: 3
, favorite_color: 'orange'
, x: 14766
}

并且 _id 不能用于在 mongodb 中查找。

如何将其转换回可用于在 mongo 上查找的格式?

- 更新 -

有趣的是,我可以findOne({_id:item._id}, collection)用来获取文档,但如果我这样做:

findOne({_id:{id : item._id.id}}, collection)

我没有收到结果。我想 mongo _id 对象有一些特别之处。

两者都 {_id:item._id}{_id:{id : item._id.id}} 当被丢弃时看起来像这样:

{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' } }

--另一个更新已解决---

集成测试文件中有一些对象 ID 操作。

objectId = new mongo.ObjectID.createFromHexString('47cc67093475061e3d95369d'); 将给出我正在寻找的 _id。

objectId.toHexString() 将返回看起来像 '47cc67093475061e3d95369d' 的十六进制字符串

4

2 回答 2

1

我的猜测是将ObjectIdsys.inspect解释为包含属性的对象。这就是你在垃圾场看到的。id

MongoDB 将 ObjectId 视为 12 字节的二进制值,而不是对象。所以 MongoDB 不知道任何id属性。这就是为什么以下查询没有产生结果的原因:

findOne({_id: {id: item._id.id}}, collection)

以下确实有效,因为它只是将两个值都视为二进制值:

findOne({_id: item._id}, collection)
于 2010-08-08T16:15:44.767 回答
0

好吧,我在使用 python 客户端时遇到了同样的错误。但我会澄清两种语言的成就结果。

首先,_idMongoDB 返回的是 BSON 对象。意思是 JSON 的二进制编码序列化,更多内容见此链接:BSON

假设您要插入具有以下字段的数据:

params = {
   "y":3,
   "favorite_color":"orange",
   "x":14766
}
client.connect(url, function(err, db) {
  var dbo = db.db("test_database");
dbo.collection("my_collection").insertOne(params, function(err, res) {
 if (err) throw err;
   console.log("inserted document",JSON.stringify(res));
    db.close();
   });
});

它返回对象结果,例如"_id":"5e95abf57b59b448bb22dedf"

定义 ObjectId,就可以方便的使用 findOne、updateOne 方法。

const {ObjectId} = require('mongodb');
client.connect(url, function(err, db) {
  var dbo = db.db("test_database");
 var myquery = { "_id": ObjectId("5e95abf57b59b448bb22dedf") } ;

    dbo.collection("my_collection").findOne(myquery, function(err, result) {
      if (err) throw err;
      console.log(result);
   });

});

更新:

client.connect(url, function(err, db) {
  var dbo = db.db("test_database");
   var myquery = { "_id": ObjectId("5e95abf57b59b448bb22dedf") } ;
    var newvalues = { $set: {favorite_color: "red", y: "14760" } };
    dbo.collection("my_collection").updateOne(myquery, newvalues, function(err, res) {
      if (err) throw err;
      console.log("1 document updated");
      db.close();
    });
});

对于蟒蛇:

让我们以这个结果为例:{'_id':ObjectId('5e95a18dcae4a4a005e14bd8')}


from bson.json_util import loads as bson_loads, dumps as bson_dumps 
import json


#you should dump it then load it 
result = document = json.loads(bson_dumps(document))
{ "$set": {"status": False}}

#update:
db["my_collection"].update_one({ "_id": result},new_value)  

#find_one:
db["my_collection"].find_one({ "_id": resultjs})

为了更多地使用 python MongoDB 客户端(电机),我创建了Gist

于 2020-04-14T13:57:53.767 回答