2014-07-09 278 views
5

有沒有辦法在MongoDB上做這樣的事情?選擇記錄匹配MongoDB中兩個字段的concat值

select * from table where concat(field1, field2) = 'value' 

爲了澄清,我有充分的名稱的數組,但文件有名字和姓氏分開的,所以我想這樣做

select * from table where concat(firstname, lastname) in ([ARRAY OF NAMES]) 

回答

13

您只能使用聚合框架做到這一點,而不是經常發現。

db.coll.aggregate({$project:{newField:{$concat:["$field1","$field2"]}}}, 
        {$match:{newField:"value"}} 
); 

注意,這將無法使用任何指標,因爲對於MongoDB中(還)在計算值指標不支持。

如果您有field1索引,你知道你有多少個字符指望字段1有助於value可以改善這種聚合這樣的表現:

db.coll.aggregate({$match:{field1:/^val/}}, 
        {$project:{newField:{$concat:["$field1","$field2"]}}}, 
        {$match:{newField:"value"}} 
); 

其中val是「價值」的第一部分字符串(你不能比的field1雖然最短的值進行比較多個字符。

編輯爲3.6版本,你可以使用中發現這樣做210表達式:

db.coll.find({$expr:{$eq:["value", {$concat:["$field1", "$field2"]}]}}) 
+1

真棒,這幾乎是我所需要的:檢查我的編輯,我又怎麼能$匹配到「in(array)」中? – Deleteman

+2

nvm,找到$ in操作符! – Deleteman

+0

在mongodb聚合鏈接是它在哪裏! – Rohmer

4

如果參數($ field1或$ field2)解析爲null值或引用缺少的字段,$ concat返回null。由於mongoDB3.0,一個新的$ IFNULL提供給檢查參數爲null,並提供一種替代

{ $ifNull: [ <expression>, <replacement-expression-if-null> ] } 

db.coll.aggregate({$project:{newField:{$concat:[{$ifNull:["$field1",""]},{$ifNull:["$field2",""]}]}}}, 
       {$match:{newField:"value"}}) 

如果我們使用$匹配的結果可能沒有差異,但這種結果會有所不同,如果你想使用$ regex。

0

在貓鼬,你可以喜歡

let clause = [            
      {$project:{name:{$concat["$first_name"," ","$last_name"]}}}, 
      {$match:{name:new RegExp("ab", 'i')}}      
     ];                    
Model.aggregate(clause) 

輸出將像

[ 
{ 
    "_id": "5911db2b9235272052fdd2e1", 
    "name": "Ali Abbas" 
}, 
{ 
    "_id": "5912f7dd8bdbc24aa37b5239", 
    "name": "Ali Abad" 
}, 
{ 
    "_id": "59229e0322abdb311818e419", 
    "name": "Syed Ali Abbas Shah" 
}, 
{ 
    "_id": "592837da188fa969cc135ddc", 
    "name": "Abu Akbar" 
} 

]

相關問題