有没有办法在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)
如果参数($ 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,则结果将有所不同。
| 归档时间: |
|
| 查看次数: |
12080 次 |
| 最近记录: |