How can I use a regex variable in a query for Mong

2019-01-15 19:28发布

问题:

I would like to make query MongoDB for documents based on a regex expression that I contruct. For e.g I have constructed a simple regex as follows that is a combination of a random letter and a random number for in Nodejs

var randnum = Math.floor((Math.random() * 10) + 1);
var alpha = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Y','Z'];
var randletter = alpha[Math.floor(Math.random() * alpha.length)];
var val = randletter + randnum + '.*;

I have tried various combinations for the regex variable like

var stream = collection.find({"FirstName": /val/).stream();
&&
var stream = collection.find({"FirstName": /$val/).stream();
&&
var stream = collection.find({"FirstName": {$in : [{$regex:val}]}}).stream()
&&
var stream = collection.find({"FirstName": {$in : [{$regex:$val}]}}).stream()

None o it seem to work. However when I write the actual regex I get the records for e.g.

var stream = collection.find({"FirstName": /J.*/).stream();

Any help will be appreciated.

Thanks Ganesh

回答1:

You need to create a regular expression object from the string using the RegExp constructor as the /.../ syntax is only for use with literals.

var stream = collection.find({"FirstName": new RegExp(val)}).stream();


回答2:

Use the following code to use dynamic value in regex with or operations

{$match: { $or: [{ 'title': { $regex:  request.query.val, $options: 'i'} }, { 'skills_required': { $regex:  request.query.val, $options: 'i'} }] }},


回答3:

If you want to use the variable val as a parameter of the query part, you can use $regex, for example:

collection.find({"FirstName": {$regex:val}})

It is not allowed to put $regex in $in operator according to the manual.

If you want to put regular expression object in $in operator, you have to use JavaScript regular expression object, for example:

collection.find({"FirstName": {$in: [/abc/, /123/]}})

By the way, val in /val/ is constant string, not the variable as you defined above.



回答4:

I was having same problem with my title and after lots of searching, i found this answer Here,

var search = 'Joe';
db.users.find(name: /^search/)
db.users.find(name: {$regex: /^search/});
db.users.find(name: {$regex: "/^" + search + "/"});

The queries above won’t return anything. The solution to this little problem is quite simple:

db.users.find(name: new RegExp(search)) //For substring search, case sensitive. 
db.users.find(name: new RegExp('^' + search + '$')) //For exact search, case sensitive
db.users.find(name: new RegExp(search, ‘i')) //For substring search, case insensitive
db.users.find(name: new RegExp('^' +search + '$', 'i')); //For exact search, case insensitive

Other flags or properties can be added base on reference here