选择与mongodb中两个字段的concat值匹配的记录

时间:2014-07-09 19:39:29

标签: mongodb concat

有没有办法在MongoDB上做这样的事情?

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

为了澄清,我有一个全名的数组,但文件的名字和姓氏是分开的,所以我想做类似的事情

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

3 个答案:

答案 0 :(得分:18)

您只能使用聚合框架,而不能使用常规查找。

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

请注意,这将无法使用任何索引,因为MongoDB中尚未支持计算值的索引。

如果您在field1上有一个索引,并且您知道您希望field1为value提供多少字符,则可以提高此聚合的效果,如下所示:

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

其中val是"值"的第一部分字符串(您不能比field1的最短可能值更多的字符。

编辑从版本3.6开始,您可以使用$expr表达式进行查找:

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

答案 1 :(得分:5)

如果参数($ 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"}})

如果我们使用$ match,结果可能没有差异,但如果你想使用$ regex,这个结果会有所不同。

答案 2 :(得分:0)

在Mongoose你可以喜欢那个

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

OutPut就像那样

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