在 Mongodb (2.6.1) 中,我需要使用 pure json(不使用 ObjectIds)通过 _id
查询文档。正如 mongodb extended json 中提到的,我期待 db.collection.findOne({"_id": {"$oid": "51b6eab8cd794eb62bb3e131"}})
工作,但事实并非如此。它甚至抛出以下异常。
Can't canonicalize query: BadValue unknown operator: $oid
有人知道怎么做吗?
最佳答案
extended JSON语法旨在作为“传输”格式,因此,例如,如果您将 JSON 输出发送到远程客户端,仍然有一种方法可以确定实际实现的类型,例如 ObjectId、Date、Binary 等。
AFIAK 实现此功能的唯一位置是在 C# 驱动程序中,该驱动程序提供了一个 json 解析器实用方法,该方法将采用带有扩展语法字段的 JSON,然后将它们“转换”为所需类型的对象。
因此,您可以以大致相同的方式实现自己的解析器例程来执行相同的操作,只需测试表示键中指定的对象类型的键值即可。给定一个示例片段:
{ "_id": { "$oid": "51b6eab8cd794eb62bb3e131" } }
采用简化形式,无需按深度递归检查:
data = JSON.parse( json );
for ( k in data ) {
if ( data[k].hasOwnProperty("$oid") )
data[k] = new ObjectId( data[k]["$oid"] );
// etc
}
因此,仅仅因为您可能使用 JavaScript,并不意味着“扩展语法”作为查询源是有效的,但您可以与其他语言一样,将解析后的 JSON 后处理为该语言所需的有效对象表示法以及查询接口(interface)。
某些驱动程序对针对 _id
字段提供的“字符串”值执行类似的“转换”,以便转换为 BSON 有线协议(protocol)所需的正确对象类型。
关于javascript - 如何在mongodb中通过纯json中的Id查询文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24111273/