开发者

Finding multiple words with find() in MongoDB

开发者 https://www.devze.com 2023-01-28 12:51 出处:网络
I\'m using Python in conjunction with MongoDB. I have an array of words, and I use these words to search the Mongo database and match any documents with matching fields using $in, e.g.

I'm using Python in conjunction with MongoDB. I have an array of words, and I use these words to search the Mongo database and match any documents with matching fields using $in, e.g.

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

The above works very well, but I want to be able to use a regex. The problem is now that if one of the words in the array was spelt accus instead of accuse, I want the find() query to still return the document (record/row) relating to the word accuse.

I've tried this, which doens't work at all, no results are returned.

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

Each element in the array reads with ^ preceding the wor开发者_JS百科d, e.g. ['^work', '^accus', '^planet']

Am I just going about this the wrong way?


Sorry for late answer, just googled your question. You should use one regex, not an array of them, like:

'^[work|accus*|planet]'


You can't use $regex inside an $in expression, but you can use JS regex (the "/regex/" kind).

From the MongoDB docs at http://docs.mongodb.org/v2.2/reference/operator/query/regex/#in-expressions:

To include a regular expression in an $in query expression, you can only use JavaScript regular expression objects (i.e. /pattern/ ). You cannot use $regex operator expressions inside an $in.

BTW, I know it's a very late answer, but hopefully it'll serve the queriers of the future...


According to Mongo docs the currect way to this is the folllowing

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

To accomplish this in JS you can create an array of RegEXp Objects and pass that array as the value of $in some thing like this :

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


Using Spring Data API, one can do the query as the following:

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

This will find all the documents with an array field called words with element in that array that match the regex.

0

精彩评论

暂无评论...
验证码 换一张
取 消