模糊搜索非严格的Mongoose模型

时间:2015-06-15 11:43:02

标签: node.js mongodb mongoose custom-fields fuzzy-search

如果有任何好办法,我就会徘徊。我有一个应用程序使用非严格的模式与自定义字段的文档。用户需要能够创建自定义字段,向特定文档添加一些信息,例如字段为customfield: {name: 'test', foo: 'bar'}。执行testbar等搜索时,他们应该提出此对象。文档的数量可能会非常庞大​​且数量众多,并且具有深层嵌套的子文档。

感谢您的帮助!到目前为止,我已经尝试过elmongo和mongoosatstic无济于事。让我知道,如果我以错误的方式解决这个问题,我会喜欢这些建议。

1 个答案:

答案 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" ] } })

它可以有效地查找信息而无需处理集合中的每个文档,以查看所需条件是否匹配。它可以在“索引”中找到它们。