有没有办法在MongoDB上做这样的事情?
select * from table where concat(field1, field2) = 'value'
为了澄清,我有一个全名的数组,但文件的名字和姓氏是分开的,所以我想做类似的事情
select * from table where concat(firstname, lastname) in ([ARRAY OF NAMES])
答案 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"
}