我有以下集合结构:
Table2
其中randomKeysSubdocument是一个带有以编程方式生成的随机密钥的子文档(我不知道他们的名字)。
有没有办法我可以通过randomKeysSubdocument值查询,就像randomKeysSubdocument是一个数组时查询它们一样:
{
_id : ObjectId('...'),
randomKeysSubdocument : {
'jhaksdf' : 'something',
'jio348akgqug' : 'something else',
'kgowe98akjg' : 'more things',
}
}
查询:
{
_id : ObjectId('...'),
randomKeysSubdocument : [
'something',
'something else',
'more things',
]
}
答案 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";
});
})
这将比标准查询慢得多,并且必须测试集合中的每个文档。
对于我来说,我会改变结构并远离使用“数据”作为键名称的模式,而是将其放在数据中而不是它所属的位置,并使结构保持一致以便搜索。