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
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();
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'} }] }},
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.
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