2016-02-10 185 views
3

好吧,我想實現一個查詢,它試圖執行上一堆文件

它堅硬的正則表達式搜索(其中包含數組列表)我解釋...所以我基本上是直接指向。

有查詢與正則表達式陣列的作品...

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

有查詢不與正則表達式陣列的作品...

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

所以基本上我想要的是刪除「」從字符串數組簽名...以便我可以執行以下查詢..

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

回答

6

它不起作用時雙引號因爲它們被解釋爲字符串而不是RegExp對象。所以爲了使它工作,你必須首先在Javascript中將它轉換爲RegExp對象。

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

記住,MongoDB的外殼使用JavaScript

+0

感謝兄弟的幫助 –

2

使用$in可與小數組是相當有效的,但不能很好地與龐大的名單,因爲它會跳過圍繞在索引中查找匹配的文件,或如果沒有要使用的索引,請遍歷整個集合。

此外using the $in with the regular expression,你可以使用管道分隔的正則表達式模式與關鍵字列表如下:

測試文件:

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

神奇:

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

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

結果

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

這裏是簡單的方法來轉換/.*/風格的正則表達式。

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

爲此,您可以爲數組中的每個項目添加正則表達式,您可以按照以下方式進行操作。

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