通过嵌套文档值在mongodb中使用随机键查找

时间:2015-06-17 12:11:50

标签: mongodb


我有以下集合结构:

Table2

其中randomKeysSubdocument是一个带有以编程方式生成的随机密钥的子文档(我不知道他们的名字)。
有没有办法我可以通过randomKeysSubdocument值查询,就像randomKeysSubdocument是一个数组时查询它们一样:

{
   _id : ObjectId('...'),
   randomKeysSubdocument : {
       'jhaksdf' : 'something',
       'jio348akgqug' : 'something else',
       'kgowe98akjg' : 'more things',
   }
}

查询:

{
   _id : ObjectId('...'),
   randomKeysSubdocument : [
       'something',
       'something else',
       'more things',
   ]
}

1 个答案:

答案 0 :(得分:1)

所以应该清楚你不应该这样做。使用不同的键名构建文档并不是一个好的模式,当然也不适用于MongoDB或一般的数据库搜索。

只有“数据”可以编入索引,因此更适合您的结构是:

{
   randomKeysSubdocument : [
       { "key": 'jhaksdf', "data": 'something' },
       { "key": 'jio348akgqug', "data": 'something else' }
       { "key": 'kgowe98akjg', "data": 'more things' }
   ]
}

如你所说,在数组中搜索很容易:

db.collection.find({ "randomKeysSubdocument.data": "something" })

当然,可以使用索引来加快速度。

您目前拥有的方式必须依赖于$where的JavaScript处理才能进行匹配,并且不能使用索引:

db.collection.find(function() {
    var doc = this.randomKeysSubDocument;
    return Object.keys(doc).some(function(key) {
       return doc[key] == "something";
    });
})

这将比标准查询慢得多,并且必须测试集合中的每个文档。

对于我来说,我会改变结构并远离使用“数据”作为键名称的模式,而是将其放在数据中而不是它所属的位置,并使结构保持一致以便搜索。