我可以索引mongo查询中的对象吗?

时间:2014-06-04 05:19:47

标签: javascript mongodb mongodb-query

使用如下的复合索引

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中保留属性顺序?

2 个答案:

答案 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-subdocumentshttp://docs.mongodb.org/manual/reference/method/db.collection.find/#query-subdocuments