我正在将Python与MongoDB结合使用。我有一系列单词,我使用这些单词搜索Mongo数据库,并使用$in
匹配任何匹配字段的文档,例如
collection.find({"word":{"$in":words}})
以上工作非常好,但我希望能够使用正则表达式。现在的问题是,如果数组中的一个单词拼写为accus
而不是accuse
,我希望find()
查询仍然返回与之相关的文档(记录/行)单词accuse
。
我已经尝试了这个,根本不起作用,没有返回结果。
collection.find({"word":{"$in":{"$regex":words}}})
数组中的每个元素都以单词前面的^
读取,
例如['^work', '^accus', '^planet']
我只是以错误的方式解决这个问题吗?
答案 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)});