2014-07-09 280 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" 
} 

]

相关问题