我正在使用Node.js构建一个使用mongodb的Web套接字服务器。
我使用node-mongodb-native作为访问mongo db的库。
当我从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已经变成了一些十六进制编码的字符串。如果我将它发送到客户端,并且客户端将其发回,我现在需要在db中更新它。我运行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'的十六进制字符串
答案 0 :(得分:1)
我的猜测是sys.inspect
将ObjectId解释为包含id
属性的对象。这就是你在转储中看到的。
MongoDB将ObjectId视为12字节的二进制值,而不是对象。所以MongoDB不知道任何id
属性。这就是为什么以下查询不会产生结果:
findOne({_id: {id: item._id.id}}, collection)
以下工作正常,因为它只将两个值都视为二进制值:
findOne({_id: item._id}, collection)
答案 1 :(得分:0)
好吧,在使用python客户端时,我遇到了同样的错误。但是我将澄清两种语言的成绩。
首先,_id
MongoDB返回的是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();
});
});
对于python:
让我们以该结果为例:{'_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