MongoDB字段排序行为在_id和其他字段上是否不同?

MongoDB字段排序行为在_id和其他字段上是否不同?,mongodb,Mongodb,我最近在我的服务器中遇到了一个bug,经过调查,MongoDB字典是因为BSON结构而被订购的 我以为我理解了,但这里有一个我不理解的测试(mongo 2.6.4):字段排序是否只对\u id重要 测试1:插入{a:1,b:2}并查找{b:2,a:1}->FOUND > db.d.insert({a: 1, b: 2}) > db.d.find() { "_id" : ObjectId("54c4dfd17e8b0ba11cf1539d"), "a" : 1, "b" : 2 } &

我最近在我的服务器中遇到了一个bug,经过调查,MongoDB字典是因为BSON结构而被订购的

我以为我理解了,但这里有一个我不理解的测试(mongo 2.6.4):字段排序是否只对
\u id
重要

测试1:插入{a:1,b:2}并查找{b:2,a:1}->FOUND

> db.d.insert({a: 1, b: 2})
> db.d.find()
{ "_id" : ObjectId("54c4dfd17e8b0ba11cf1539d"), "a" : 1, "b" : 2 }
> db.d.find({b: 2, a: 1})
{ "_id" : ObjectId("54c4dfd17e8b0ba11cf1539d"), "a" : 1, "b" : 2 }
测试2:插入{smthg:{a:1,b:2}}和查找{smthg:{b:2,a:1}}->未找到

> db.d.insert({smthg: {a: 1, b: 2}})
> db.d.find({smthg: {b: 2, a: 1}})
> db.d.find({smthg: {a: 1, b: 2}})
{ "smthg" : { "a" : 1, "b" : 2 } }
感谢您的解释

我将直接引用以下内容:

子文档中的相等匹配如果 子文档与指定的子文档完全匹配,包括 现场秩序

为此,您可以通过以下方式获得更好的服务:


请问您为什么要在_id字段中保存嵌入对象?@joao我将其用作密钥。例如:_id:{first_name,last_name},然后我就可以查看它了。其他原因:mapreduce的密钥以这种形式出现文档id是所有文档都具有的一个特殊的唯一字段,除非有充分的理由,否则不应将其弄乱。您可以通过添加更多字段来解决问题,如第一个示例中所示。此外,map reduce的结果\u id与原始文档\u id没有任何关系,因此在这里也没有这样做的逻辑。@joao 1)我正在对mapreduce结果进行查询->我需要查询像本例中那样的\u id字段2)为什么测试1有效?难道它不应该因为mongodb处理有序字典的方式而失败吗?3) 我编辑了我的问题,并用“smthg”替换了“\u id”。同样的结果检查文档的这一部分,它回答了这个问题:仅在演示的单数“子文档”的情况下添加。如果“子文档”是数组的成员,那么正确的表示法是
{“smthng”:{“$elemMatch”:{“a”:1,“b”:2}}}
。但您只能对真正的“数组”执行此操作。如果对该结构执行此操作,它将失败,因为它不是数组。
db.d.find({"smthg.a" : 1, "smthg.b" : 2});