2016-02-10 5 views
3

Ok je suis en train de mettre en œuvre une requête qui tente d'effectuer une recherche de regex (qui contient une liste de tableau) sur un tas de documents

Il est difficile pour moi d'expliquer ... donc je suis en train d'arriver directement au point.

Il y a recherche qui travaille avec tableau ... regex

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

Il y a requête qui ne fonctionne pas avec tableau ... regex

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

Donc, fondamentalement, ce que je veux est de supprimer "" signe de tableau de chaînes ... de sorte que je peux effectuer une requête ci-dessous ..

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

Répondre

6

cela ne fonctionne pas lorsque la double citation s sont présents car ils sont interprétés comme des chaînes au lieu de RegExp objets. Donc, pour que cela fonctionne, vous devez le convertir en RegExp objets d'abord en Javascript comme ceci.

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}}); 

Rappelez-vous, shell MongoDB utilise Javascript

+0

Merci pour l'aide –

2

En utilisant $in peut être assez efficace avec les petits réseaux, mais pas si bien avec des listes énormes car il sautera autour de l'index pour trouver les documents correspondants, ou parcourir toute la collection s'il n'y a pas d'index à utiliser.

En plus using the $in with the regular expression, vous pouvez utiliser un modèle de regex tube délimité par la liste des mots-clés comme celui-ci:

documents d'essai:

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" }, 
]); 

La magie:

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

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

Les résultats

{ "_id" : ObjectId("56bb6f171bb4f693057c0ba4"), "category" : "ad bd cd" } 
{ "_id" : ObjectId("56bb6f171bb4f693057c0baa"), "category" : "sd td ud" } 
{ "_id" : ObjectId("56bb6f171bb4f693057c0bab"), "category" : "vd wd xd yd zd" } 
0

Voici moyen simple de transformer le style /.*/ regex.

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

var rx = []; 
sea.forEach(function name(value) { 
    var v = value.replace(/\//ig,""); 
    rx.push(new RegExp(v)); 
}); 

db.paper.find({"category": {$in: rx}}); 
1

Pour cela, vous pouvez ajouter une expression régulière à chaque élément dans le tableau, vous pouvez le faire de la façon suivante.

data = ['hoLA','Que','TAL', 'Nueva']; 
data = data.map(function(v, i){return new RegExp(v, 'i')}); 
MyCollection.find({"thing": {$in : data}}, function(err, data){ 
    if (err) { 
     console.log(err) 
    }else{ 
     data.forEach(function(item){ 
      console.log(item.nombre); 
     }) 
    } 
});