2016-04-29 32 views
0

我試圖使用regex$in操作符(如文檔中所述),但我仍無法獲取該值。

db.users.find({'profile.firstName':{$in:["/justin/i"]}}).count() = 0

,但是當我用這樣的

db.users.find({'profile.firstName':{$in:["justin"]}}).count()=1

db.users.find({'profile.firstName':{$in:["Justin"]}}).count()=2

編輯問題

好像我不是跟我的無線問題明確將添加代碼以便於理解

我試圖從查詢中區分大小寫的文檔列表。我認爲最好用代碼解釋我的疑問。

Meteor.users.find({'profile.firstName':{$in:[/justin/i,/helen/i]}}).count()

會給文件,其profile.firstNamejustin/Justin/JUSTIn/HElen/helen

但我的疑問,如何給變量x=["sai","test","jacob",---etc]代替helen/justin

回答

5

您需要包裝中的元素與RegExp對象陣列即

regex = [new RegExp("sai", "i"), new RegExp("test", "i"),...]

可以使用map()方法將數組中的元素與正則表達式包裝到一個新的數組,你可以在正則表達式查詢與$in然後使用地圖:

var x = ["sai","test","jacob","justin"], 
    regex = x.map(function (e) { return new RegExp(e, "i"); }); 

db.users.find({"profile.firstName": { "$in": regex } }); 

使用$in對於小型數組可能相當有效,但對於大型列表來說效率不高,因爲它會在索引中跳過以查找匹配的文檔,或者在沒有索引的情況下遍歷整個集合。


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

var x = ["sai","test","jacob","justin"], 
    regex = x.join("|"); 

db.users.find({ 
    "profile.firstName": { 
     "$regex": regex, 
     "$options": "i" 
    } 
}).count; 
1

嘗試做這樣

db.users.find({'profile.firstName':{$in:[/justin/i]}}).count() = 0 

ÿ你將正則表達式作爲字符串傳遞。

通常你應該在一個時間問一個問題,這樣的問題仍然集中於特定的問題

那麼你可以直接通過它,這樣

// Here I am creating regex for all the elements in array 
let myRegex = new RegExp(myArray.join('|'), i) 
and then I can pass this regex 
db.users.find({'profile.firstName':{$in: myRegex}}).count() = 0 
+0

嘿感謝解決方案,但請檢查一次問題,因爲我已經加入多一點吧。 –

+0

但不會使查詢區分大小寫 –

相關問題