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

Del*_*man 12 concat mongodb

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

select * from table where concat(field1, field2) = 'value'
Run Code Online (Sandbox Code Playgroud)

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

select * from table where concat(firstname, lastname) in ([ARRAY OF NAMES])
Run Code Online (Sandbox Code Playgroud)

Asy*_*sky 21

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

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

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

如果你有一个索引,field1并且你知道你希望field1贡献多少个字符,value你可以改善这个聚合的性能,如下所示:

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

where val值是"value"字符串的第一部分(field1尽管如此,你不能比较尽可能短的值来比较更多的字符.

编辑版本3.6,您可以使用$expr表达式查找:

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

  • nvm,找到$ in运算符! (2认同)
  • 请将C#作为一个单独的问题. (2认同)

Sri*_*har 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"}})
Run Code Online (Sandbox Code Playgroud)

如果我们使用$ match,结果可能不会有所不同,但是如果您要使用$ regex,则结果将有所不同。