Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB query $in with regex array of element

Ok i am trying to implement a query, which is trying to perform regex search ( which contains an array list ) on a bunch of document

Its hard for me to explain...so I am basically coming to direct point.

There is query which works with regex array...

db.paper.find({"category": {$in: [ /xd/, /sd/, /ad/ ] }})

There is query which doesn't works with regex array...

db.paper.find({"category": {$in: [ "/xd/", "/sd/", "/ad/" ] }})

So basically what I want is remove "" sign from string array...so that i can perform below query..

var sea = [ "/xd/", "/sd/", "/ad/" ];
db.paper.find({"category": {$in: sea }});
like image 429
Shiid Shah Sury Avatar asked Feb 10 '16 16:02

Shiid Shah Sury


3 Answers

Using $in can be fairly efficient with small arrays but not so well with huge lists since it will skip around in the index to find the matching documents, or walk through the whole collection if there isn't an index to use.

Besides using the $in with the regular expression, you could use a pipe-delimited regex pattern with the keywords list like this:

Test documents:

db.papertest.insert([
    { category: "ad bd cd" },
    { category: "dd ed fd" },
    { category: "gd hd id" },
    { category: "jd kd ld" },
    { category: "md nd od" },
    { category: "pd qd rd" },
    { category: "sd td ud" },
    { category: "vd wd xd yd zd" },
]);

The magic:

var keywords = ["xd", "sd", "ad"],
    regex = keywords.join("|");

db.papertest.find({
    "category": {
        "$regex": regex, 
        "$options": "i"
    } 
});

The results

{ "_id" : ObjectId("56bb6f171bb4f693057c0ba4"), "category" : "ad bd cd" }
{ "_id" : ObjectId("56bb6f171bb4f693057c0baa"), "category" : "sd td ud" }
{ "_id" : ObjectId("56bb6f171bb4f693057c0bab"), "category" : "vd wd xd yd zd" }
like image 164
chridam Avatar answered Oct 18 '22 21:10

chridam


it does not work when the double quotes are present because they are interpreted as strings instead of as RegExp objects. So to make it to work, you have to convert it to RegExp objects first in Javascript like this.

var sea = [ "xd", "sd", "ad" ]; // Note: no slashes
var regex = [];
for (var i = 0; i < sea.length; i++) {
    regex[i] = new RegExp(sea[i]);
}
db.paper.find({"category": {$in: regex}});

Remember, MongoDB shell uses Javascript

like image 13
Meme Composer Avatar answered Oct 18 '22 19:10

Meme Composer


It seems to be working fine for me please try this

var sea = [ "xd", "sd", "ad" ];

var regex = sea.map( function( val ){ 
        return new RegExp( '^['+val+'].*','i' ); 
    }) 

db.paper.find({"category": { $in: regex }});
like image 2
Vinesh Patel Avatar answered Oct 18 '22 19:10

Vinesh Patel