使用如下的复合索引
db.data.ensureIndex({ userId: 1, myObject: 1 })
以下内容是否会使用此索引?
db.data.find({
userId: 1,
myObject: {
a:'test',
b:'test2'
}
})
我在Javascript中知道对象不会保留他们的顺序,所以在Mongo中它是一样的吗?
如果我的文档中包含不同顺序的对象,那将会发生什么。
{
_id: ObjectId,
userId:1,
myObject: {
b: 'test',
a: 'test2'
}
},
{
_id: ObjectId,
userId:1,
myObject: {
b: 'test',
a: 'test2'
}
},
{
_id: ObjectId,
userId:2,
myObject: {
b: 'test',
a: 'test2'
}
}
在索引像上面这样的对象时,属性的顺序是否重要?
编辑: 在文档中,http://docs.mongodb.org/manual/core/index-single/它表示"当在子文档上执行相等匹配时,字段顺序事项和子文档必须完全匹配。"
在他们的例子中,以下内容可行
db.factories.find( { metro: { city: "New York", state: "NY" } } )
但是如果地铁领域是另一种方式它不会工作
db.factories.find( { metro: { state: "NY", city: "New York" } } )
那么当语言本身不支持时,如何在Javascript / Node中保留属性顺序?
答案 0 :(得分:1)
实际上,JavasScript或JSON表示法对象确实保留了它们的顺序。如果MongoDB在文档增长时必须移动它们,一些顶级属性可能会随机播放,一般来说,这个“子级”文档不应该从最初插入的顺序改变。
那说某些语言默认会尝试命令他们的“Hash”,“Map”,“Dict”键,因此在处理这些语言时查找和“有序”或“索引”形式变得很重要,但这是另一个问题。
对于影响此订单的MongoDB“索引”的问题,不是。事实上,您添加的索引虽然没有错误,但实际上并没有任何价值,因为Object
或{}
基本上没有索引的值来处理。
你可以做的是:
db.data.ensureIndex({ "userId": 1, "myObject.a": 1 })
在对象的“a”属性中保留升序索引。如果在查询中定期查看此内容,这将非常有用。
如果您尝试这样查询,您也可能遇到问题:
db.data.find({ "Object": { a: "test2", b: "test" } })
实际存储的密钥不按顺序排列。但这通常由“点符号”形式确定:
db.data.find({ "Object.a": "test2", "Object.b": "test" })
这不关心密钥的实际顺序。
但是您定义的索引并没有按照插入顺序保留“键”,这完全是语言特定的
答案 1 :(得分:1)
订单对子文档的索引很重要。引用文档:
此查询返回上述文档。执行平等时 子文档,字段顺序事项和子文档必须匹配 完全匹配。例如,以下查询与 上面的文件
考虑这个文件:
{
_id: ObjectId(...),
metro: {
city: "New York",
state: "NY"
},
name: "Giant Factory"
}
和这个索引:
db.factories.ensureIndex( { metro: 1 } )
此查询匹配:
db.factories.find( { metro: { city: "New York", state: "NY" } } )
而这个没有:
db.factories.find( { metro: { state: "NY", city: "New York" } } )
参见http://docs.mongodb.org/manual/core/index-single/#indexes-on-subdocuments 和http://docs.mongodb.org/manual/reference/method/db.collection.find/#query-subdocuments