我正在使用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上查找的格式?
--update--
有趣的是,我可以使用 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'的十六进制字符串
1 回答
我的猜测是
sys.inspect
将ObjectId解释为包含id
属性的对象 . 那个's what you'在转储中看到了 .MongoDB将ObjectId视为12字节的二进制值,而不是对象 . 所以MongoDB不知道任何
id
属性 . 这就是为什么以下查询不会产生结果:以下工作正常,因为它只将两个值视为二进制值: