Mongodb - 如何在多个字段中查找字符串?

时间:2011-11-23 06:37:22

标签: mongodb

在这种情况下使用Pymongo。

我的用户有电子邮件,first_name,last_name。

我正在使用这个Pymongo片段:

user_found = users.find({'$or':[
            {'email':{'$regex':searchString, '$options':'i'}},
            {'first_name':{'$regex':searchString, '$options':'i'}},
            {'last_name':{'$regex':searchString, '$options':'i'}}]})

这个例子有用,如果我想在:

中找到searchString
  • 电子邮件或
  • first_name或
  • 姓氏

现在我还需要在first_name + last_name combined中找到searchString。

我该怎么做? 在mongo中是否有办法通过查询将两者合并为“全名”,然后搜索全名?

2 个答案:

答案 0 :(得分:14)

最简单的方法是添加一个数组字段,并使用您要搜索的所有变体填充它。索引该数组字段。

这样,您只需要一个索引,并且您在所有字段中的搜索很简单,并且当您要搜索某些新搜索变体时不会更改。您还可以规范化放入搜索数组中的文本,例如,降低它的大小,删除标点符号等。

请参阅https://stackoverflow.com/q/8206188/224370

编辑:MongoDB的文档现在涵盖了keyword search和新的full-text search功能。

答案 1 :(得分:1)

我遇到了同样的问题。我已经使用了正则表达式字符串搜索,所以我的解决方案是:

生成一个帮助器集合。在这里,我结合了所有相关的字符串,如:

{
    search_field: email + " " + first_name + " " + last_name,
    ref_id: (id to real object)
}

然后我使用正则表达式创建我允许查找的内容:

// logic found here: http://stackoverflow.com/questions/10870372/regex-match-if-string-contain-all-the-words-or-a-condition
var words = query.split(/[ ,]+/);
var regstr = "";
for (var i = 0; i < words.length; ++i) {
    var word = words[i];
    regstr += "(?=.*?\\b" + word + ")";
}
regstr += "^.*$";
regex = new RegExp(regstr, "i");

这也为订单提供了一些灵活性。

搜索不是最快的,因为它仍然在所有元素上使用正则表达式,但它对我来说没问题。 (我也在search_field上索引集合。

获得结果也成为一个嵌套调用,因为首先你需要得到你真正想要的_ids,然后你可以像这样查询它们:

connection.find({ "search_field" : regex }, { _id: 0, ref_id: 1 }, { limit: limit, skip: start }).toArray(function (err, docs) {
    if (err) throw err;
    // map array of documents into simple array of ids
    var ids = [];
    for (var i = 0; i < docs.length; ++i)
    {
        var doc = docs[i];
        ids.push(doc.ref_id);
    }
    if (ids.length > 0)
        MongooseEmails.find({ "_id": { $in: ids } }, function (err, docres) {
            if (err) throw err;
            res.send(JSON.stringify(docsres));
        });
    else
        res.send("");
});

这是编辑过的代码..也许有一个语法错误,一般来说,它对我有用。