我具有以下集合结构:
{
_id : ObjectId('...'),
randomKeysSubdocument : {
'jhaksdf' : 'something',
'jio348akgqug' : 'something else',
'kgowe98akjg' : 'more things',
}
}
其中randomKeysSubdocument是一个子文档,具有以编程方式生成的随机密钥(我不知道它们的名称)。
有没有一种方法可以按照与randomKeysSubdocument是数组的查询方式相同的方式通过randomKeysSubdocument值进行查询:
{
_id : ObjectId('...'),
randomKeysSubdocument : [
'something',
'something else',
'more things',
]
}
询问:
db.my_collection.find({
randomKeysSubdocument : 'something'
})
因此,很明显您不应该这样做。用不同的键名构造文档不是一个好的模式,并且肯定不适用于MongoDB或常规数据库搜索。
只有“数据”可以建立索引,因此对您来说更好的结构是:
{
randomKeysSubdocument : [
{ "key": 'jhaksdf', "data": 'something' },
{ "key": 'jio348akgqug', "data": 'something else' }
{ "key": 'kgowe98akjg', "data": 'more things' }
]
}
您注意到在数组中搜索的位置已经很容易了:
db.collection.find({ "randomKeysSubdocument.data": "something" })
当然,可以使用索引来加快处理速度。
当前的处理方式必须依靠JavaScript处理,$where
并且不能为此使用索引:
db.collection.find(function() {
var doc = this.randomKeysSubDocument;
return Object.keys(doc).some(function(key) {
return doc[key] == "something";
});
})
这将比标准查询慢得多,并且必须测试集合中的每个文档。
对于我的我,我将改变结构,不再使用“数据”作为键名的模式,而是将其放在数据中,而不是它所属的位置,并保持结构一致以进行搜索。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句