Mongo JSON 文档 -> JSON -> BSON
Posted
技术标签:
【中文标题】Mongo JSON 文档 -> JSON -> BSON【英文标题】:Mongo JSON document -> JSON -> BSON 【发布时间】:2011-03-26 23:26:25 【问题描述】:我正在使用 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' 的十六进制字符串
【问题讨论】:
那么,我猜你的问题解决了? 不,真正的问题是我需要某种形式的 mongo id 可以发送到客户端浏览器(最好是 json 格式),然后客户端可以将其发回用于查找对象在 mongodb 中。 【参考方案1】:我的猜测是 sys.inspect
将 ObjectId 解释为包含 id
属性的对象。这就是您在转储中看到的内容。
MongoDB 将 ObjectId 视为 12 字节的二进制值,而不是对象。所以 MongoDB 不知道任何 id
属性。这就是为什么下面的查询没有结果的原因:
findOne(_id: id: item._id.id, collection)
以下确实有效,因为它只是将两个值都视为二进制值:
findOne(_id: item._id, collection)
【讨论】:
谢谢,现在这更有意义了。有没有办法将该对象转换为字符串或更便携的数据类型,然后再将其转换回来?我需要一些东西发送到客户端浏览器,这些东西可以被发回以识别对象。 您应该将4c3f23268ead0e8f14050000
格式发送给客户端,因为这似乎是ObjectId 的标准文本表示。在 Mongo shell 中,toString() 方法返回这样一个字符串。我希望这也能在 node-mongodb-native/node.js 中实现。
感谢您的帮助!类似的东西可以作为图书馆的一部分。
您还可以对包含 objectid 实例的文档执行 JSON.stringify(),它会在对象上调用 toJson 方法,返回 objectID 的十六进制表示。【参考方案2】:
好吧,我在使用 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
【讨论】:
以上是关于Mongo JSON 文档 -> JSON -> BSON的主要内容,如果未能解决你的问题,请参考以下文章