在MongoDB中使用find()查找多个单词

时间:2010-12-03 12:08:53

标签: python regex mongodb

我正在将Python与MongoDB结合使用。我有一系列单词,我使用这些单词搜索Mongo数据库,并使用$in匹配任何匹配字段的文档,例如

collection.find({"word":{"$in":words}})

以上工作非常好,但我希望能够使用正则表达式。现在的问题是,如果数组中的一个单词拼写为accus而不是accuse,我希望find()查询仍然返回与之相关的文档(记录/行)单词accuse

我已经尝试了这个,根本不起作用,没有返回结果。

collection.find({"word":{"$in":{"$regex":words}}})

数组中的每个元素都以单词前面的^读取, 例如['^work', '^accus', '^planet']

我只是以错误的方式解决这个问题吗?

4 个答案:

答案 0 :(得分:10)

对不起,迟到的回答,只是用谷歌搜索你的问题。你应该使用一个正则表达式,而不是它们的数组,如:

'^[work|accus*|planet]'

答案 1 :(得分:4)

你不能在$ in表达式中使用$ regex,但你可以使用JS正则表达式(“/ regex /”类)。

来自MongoDB文档:http://docs.mongodb.org/v2.2/reference/operator/query/regex/#in-expressions

“要在$ in查询表达式中包含正则表达式,您只能使用JavaScript正则表达式对象(即/ pattern /)。您不能在$ in中使用$ regex运算符表达式。”

顺便说一句,我知道这是一个非常晚的答案,但希望它能为未来的查询者提供服务......

答案 2 :(得分:1)

使用Spring Data API,可以执行以下查询:

Query query = new Query();
query.addCriteria(Criteria.where("words").in(Pattern.compile(regex-String)));
find(query)

这将找到所有带有名为words的数组字段的文档,该数组中的元素与正则表达式匹配。

答案 3 :(得分:1)

根据Mongo docs,目前的方法是以下

var words = [/hello/, /^world/];// array of regex
db.getCollection('word collection').find({"word" : {$in : words}});

要在JS中完成此操作,您可以创建一个RegEXp个对象数组,并将该数组作为$in的值传递给这样的事情:

words = words.map(function(v){return new RegExp(v)});