Combining $ regex and $ or operators in Mongo

I want to use the $or and $regex operators at the same time.

db.users.insert([{name: "Alice"}, {name: "Bob"}, {name: "Carol"}, {name: "Dan"}, {name: "Dave"}])

Using $regex works fine:

 > db.users.find({name: {$regex: "^Da"}}) { "_id" : ObjectId("53e33682b09f1ca437078b1d"), "name" : "Dan" } { "_id" : ObjectId("53e33682b09f1ca437078b1e"), "name" : "Dave" } 

When you enter $or answer changes. I expected the same answer:

 > db.users.find({name: {$regex: {$or: ["^Da"]}}}) { "_id" : ObjectId("53e33682b09f1ca437078b1a"), "name" : "Alice" } { "_id" : ObjectId("53e33682b09f1ca437078b1b"), "name" : "Bob" } { "_id" : ObjectId("53e33682b09f1ca437078b1c"), "name" : "Carol" } { "_id" : ObjectId("53e33682b09f1ca437078b1d"), "name" : "Dan" } { "_id" : ObjectId("53e33682b09f1ca437078b1e"), "name" : "Dave" } 

I also tried changing the order of the statements:

 > db.users.find({name: {$or: [{$regex: "^Da"}, {$regex: "^Ali"}]}}) error: { "$err" : "invalid operator: $or", "code" : 10068 } 

However, the following query seems to work fine, but it's a little long ( name repeats):

 > db.users.find({$or: [{name: {$regex: "^Da"}}, {name: {$regex: "^Ali"}}]}) { "_id" : ObjectId("53e33682b09f1ca437078b1a"), "name" : "Alice" } { "_id" : ObjectId("53e33682b09f1ca437078b1d"), "name" : "Dan" } { "_id" : ObjectId("53e33682b09f1ca437078b1e"), "name" : "Dave" } 

Is there a shorter way to use $regex and $or in such queries?

The goal is to use the $regex operator, and not /.../ (real regular expressions).

+7
regex mongodb mongodb-query
source share
1 answer

The $or operator expects all conditions, so the correct form is:

 db.users.find({ "$or": [ { "name": { "$regex": "^Da"} }, { "name": { "$regex": "^Ali" }} ]}) 

Or, of course, using $in :

 db.users.find({ "name": { "$in": [/^Da/,/^Ali/] } }) 

But this is a regular expression that you can do:

 db.users.find({ "name": { "$regex": "^Da|^Ali" } }) 
+14
source share

All Articles