如果有任何好办法,我就会徘徊。我有一个应用程序使用非严格的模式与自定义字段的文档。用户需要能够创建自定义字段,向特定文档添加一些信息,例如字段为customfield: {name: 'test', foo: 'bar'}
。执行test
或bar
等搜索时,他们应该提出此对象。文档的数量可能会非常庞大且数量众多,并且具有深层嵌套的子文档。
感谢您的帮助!到目前为止,我已经尝试过elmongo和mongoosatstic无济于事。让我知道,如果我以错误的方式解决这个问题,我会喜欢这些建议。
答案 0 :(得分:0)
如果没有JavaScript处理(例如$where
可用的内容),确实没有很好的方法可以做到这一点。考虑到这样的评估不能可能使用“索引”,这是对任何数据库系统的“查询”的最大优化,这并不是很好。
考虑你的样本:
{
"customField": {
"name": "test",
"foo": "bar"
}
}
如果你想在这里搜索“test”或“bar”,你需要这样做:
db.collection.find(function() {
var doc = this;
return Object.keys(doc).some(function(key) {
return doc[key] == "test" || doc[key] == "bar";
});
})
更好的方法是不使用“数据点”作为“键”,并在数组中的条目上创建“更平坦的属性”:
{
"customFields": [
{ "name": "name", "data": "test" },
{ "name": "foo", "data": "bar" }
]
}
然后你可以在集合上创建一个简单的“索引”,如:
db.collection.ensureIndex({ "customFields.data": 1 })
并发出如下查询:
db.collection.find({ "customFields.data": { "$in": [ "test", "bar" ] } })
它可以有效地查找信息而无需处理集合中的每个文档,以查看所需条件是否匹配。它可以在“索引”中找到它们。