有没有办法在MongoDB上做这样的事情?选择记录匹配MongoDB中两个字段的concat值
select * from table where concat(field1, field2) = 'value'
为了澄清,我有充分的名称的数组,但文件有名字和姓氏分开的,所以我想这样做
select * from table where concat(firstname, lastname) in ([ARRAY OF NAMES])
有没有办法在MongoDB上做这样的事情?选择记录匹配MongoDB中两个字段的concat值
select * from table where concat(field1, field2) = 'value'
为了澄清,我有充分的名称的数组,但文件有名字和姓氏分开的,所以我想这样做
select * from table where concat(firstname, lastname) in ([ARRAY OF NAMES])
您只能使用聚合框架做到这一点,而不是经常发现。
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"]}]}})
如果参数($ 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。
在猫鼬,你可以喜欢
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"
}
]
真棒,这几乎是我所需要的:检查我的编辑,我又怎么能$匹配到“in(array)”中? – Deleteman
nvm,找到$ in操作符! – Deleteman
在mongodb聚合链接是它在哪里! – Rohmer