2016-04-14 36 views
1

我正在尋找一個邏輯來從數據庫中檢索數據從1000個記錄。我不能在應用程序級別做。使用數組的MongoDB正則表達式搜索

我有結尾兩個雙胞胎字母,如「ll,gg,ss,ff ...」的數據。想要檢索以上述來自DB的雙字符結束的單詞。

我的樣品DB:

[{ 
    "word": "Floss" 
    }, { 
    "word": "smacx" 
    }, { 
    "word": "fuzz" 
    }, { 
    "word": "grass" 
    }, { 
    "word": "dress" 
    }, { 
    "word": "puff" 
    }, { 
    "word": "cliff" 
    }, { 
    "word": "sniff" 
    }, { 
    "word": "chess" 
    }, { 
    "word": "kiss" 
    }, { 
    "word": "fell" 
    }, { 
    "word": "shell" 
    }] 

checkarray = [ 'LL', 'G-G', 'LL', 'SS'];

關於如何將其作爲數據庫級別進行操作的任何想法。由於應用程序級別循環有近10萬條記錄,因此應用級循環時間長,花費時間更長。

回答

2

您可以use the $in with regular expression通過創建RegExp對象的一個​​新的數組如下與$in表達式中使用:

var checkarray = ['ll','gg','ll','ss'], 
    regex = checkarray.map(function (k) { return new RegExp(k); }); 
db.collection.find({ 
    "word": { "$in": regex } 
}) 

記住,使用$in可以是具有小數組相當有效但對於巨大的列表來說並不那麼好,因爲它會在索引中跳過來查找匹配的文檔,或者如果沒有要使用的索引,則遍歷整個集合。


此外using the $in with the regular expression,您可以使用$regex運營商,包括像這樣的checkarray管道分隔正則表達式:

var checkarray = ['ll','gg','ll','ss'], 
    regex = checkarray.join("|"); 
db.collection.find({ 
    "word": { 
     "$regex": regex, 
     "$options": "i" 
    } 
}) 

到最後兩個字符匹配,使用遵循的模式,即將$附加到元字符表示字符串結尾的模式。例如,模式abc$可以匹配以下abc, endsinabc, 123abc, ...

因此,對於您後續問題

我需要它結束的checkArray的信件,而不是在 中間或啓動的話。 CheckArray字符應該以字符串 結尾。像「蛋」而不是「裝」

你可以去像這樣:

var checkarray = ['ll','gg','ff','ss'], 
    regex = checkarray.map(function (k) { return new RegExp(k+'$'); }); 
db.collection.find({ 
    "word": { "$in": regex } 
}) 

要進行測試,填充這些樣本文件來測試集合:

db.test.insert([ 
    { "_id": 1, "word" : "well" }, 
    { "_id": 2, "word" : "filled" }, 
    { "_id": 3, "word" : "glass" }, 
    { "_id": 4, "word" : "blessed" } 
]) 

以上查詢將返回文件_id s 1和3.

{ "_id" : 1, "word" : "well" } 
{ "_id" : 3, "word" : "glass" } 
+0

真棒。正常工作感謝您的快速響應。小變化。我需要在中間或起始處以checkArray的字母結尾的單詞。 CheckArray字符應該以字符串結尾。像「EGG」而不是「FILLED」,尋求幫助。@chridam –

+0

@ user1099855我已經用該解決方案更新了我的答案。 – chridam

+0

完美,工作正常 –