选择与mongodb中两个字段的concat值匹配的记录
在MongoDB上有没有这样的方法选择与mongodb中两个字段的concat值匹配的记录,mongodb,concat,Mongodb,Concat,在MongoDB上有没有这样的方法 从表中选择*,其中concat(字段1,字段2)=“值” 为了澄清,我有一个全名数组,但是文档的名字和姓氏是分开的,所以我想做一些类似的事情: 从concat(firstname,lastname)所在的表中选择*([名称数组]) 您只能使用聚合框架,而不能使用常规查找 db.coll.aggregate({$project:{newField:{$concat:["$field1","$field2"]}}}, {$ma
从表中选择*,其中concat(字段1,字段2)=“值”
为了澄清,我有一个全名数组,但是文档的名字和姓氏是分开的,所以我想做一些类似的事情:
从concat(firstname,lastname)所在的表中选择*([名称数组])
您只能使用聚合框架,而不能使用常规查找
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
是“value”字符串的第一部分(但比较的字符不得超过field1
的最短可能值
编辑从3.6版开始,您可以使用$expr
表达式在查找中执行此操作:
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"}})
{$ifNull:[,]}
db.coll.aggregate({$project:{$newField:{$concat:[{$ifNull:[“$field1”,”“]},{$ifNull:[“$field2”,”“]}},
{$match:{newField:“值”}})
如果我们使用$match,结果可能不会有所不同,但是如果您想使用$regex,结果会有所不同。在Mongoose中,您可以这样做
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"
}
]太棒了,这几乎就是我需要的:检查我的编辑,如何将$match转换为“in(array)”?nvm,找到$in操作符!mongodb聚合中的链接就是它所在的位置!@AsyaKamsky-如何使用mongodb在C中实现同样的功能。驱动程序请单独问C。