Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择与mongodb中两个字段的concat值匹配的记录_Mongodb_Concat - Fatal编程技术网

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

选择与mongodb中两个字段的concat值匹配的记录,mongodb,concat,Mongodb,Concat,在MongoDB上有没有这样的方法 从表中选择*,其中concat(字段1,字段2)=“值” 为了澄清,我有一个全名数组,但是文档的名字和姓氏是分开的,所以我想做一些类似的事情: 从concat(firstname,lastname)所在的表中选择*([名称数组]) 您只能使用聚合框架,而不能使用常规查找 db.coll.aggregate({$project:{newField:{$concat:["$field1","$field2"]}}}, {$ma

在MongoDB上有没有这样的方法

从表中选择*,其中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。