Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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 Mongo聚合嵌套数组_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb Mongo聚合嵌套数组

Mongodb Mongo聚合嵌套数组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个mongo集合,其结构如下 { userId:ObjectIdXXX, itemId:Objectyyy, 资源ID:1, _id:Objected528455229486CA3606004EC9, 参数:[ { 姓名:姓名1, 价值:150, _id:Objected528455359486CA3606004EED }, { 姓名:姓名2, 值:0, _id:Objected528455359486CA3606004EEC }, { 姓名:姓名3, 价值:2, _id:Objected

我有一个mongo集合,其结构如下

{ userId:ObjectIdXXX, itemId:Objectyyy, 资源ID:1, _id:Objected528455229486CA3606004EC9, 参数:[ { 姓名:姓名1, 价值:150, _id:Objected528455359486CA3606004EED }, { 姓名:姓名2, 值:0, _id:Objected528455359486CA3606004EEC }, { 姓名:姓名3, 价值:2, _id:Objected528455359486CA3606004EEB } ] } 可以有多个文档具有相同的“useId”和不同的“itemId”,但参数将在所有文档中具有相同的键/值对

我试图实现的是为每个唯一的userId返回聚合参数name1、name2和name3,而忽略“itemId”。因此,每个用户的最终结果如下所示:

{ userId:ObjectIduse1ID, 名称1:aggregatedValue, 名称2:aggregatedValue, 名称3:聚合值 }, { userId:ObjectIduse2ID, 名称1:aggregatedValue, 名称2:aggregatedValue, 名称3:聚合值 }
使用mongoDB的聚合方法可以实现这一点吗?你能帮我建立正确的查询来完成吗

不确定我是否了解您的问题,但如果名称字段只能包含name1、name2、name3或至少您只对这些值感兴趣,则可能的查询之一是:

db.aggTest.aggregate(
    {$unwind:"$parameter"}, 
    {$project: {"userId":1, "parameter.name":1, 
       "name1" : {"$cond": [{$eq : ["$parameter.name", "name1"]}, "$parameter.value", 0]},
       "name2" : {"$cond": [{$eq : ["$parameter.name", "name2"]}, "$parameter.value", 0]}, 
       "name3" : {"$cond": [{$eq : ["$parameter.name", "name3"]}, "$parameter.value", 0]}}}, 
    {$group : {_id : {userId:"$userId"}, 
       name1 : {$sum:"$name1"}, 
       name2 : {$sum:"$name2"}, 
       name3 : {$sum:"$name3"}}})
它首先展开参数数组,然后将name1、name2和name3值分成不同的列。这里有一个简单的条件语句。在那之后,我们可以很容易地被新的专栏所吸引


希望有帮助

最简单的形式是通过参数名设置关键帧:

db.collection.aggregate //展开阵列 {$unwind:$parameter}, //在_id、name和$sum值上创建组 {$group:{ _id:{ userId:$userId, 名称:$parameter.name }, 值:{$sum:$parameter.value} }}, //将内容放入数组以进行良好的处理 {$group:{ _id:$\u id.userId, 值:{$push:{ 名称:$\u id.name, 价值:$value }} }} 如果确实需要将名称的值作为字段值,可以执行以下操作。但是,由于要投影字段/属性,因此必须在代码中全部指定它们。您不再是动态的,您正在编码/生成每一个:

db.collection.aggregate[ //展开阵列 {$unwind:$parameter}, //在_id、name和$sum值上创建组 {$group:{ _身份证:{ userId:$userId, 名称:$parameter.name }, 值:{$sum:$parameter.value} }}, //用$cond投影出离散字段名 {$项目:{ 名称1:{$cond:[ {$eq:[$\u id.name,name1]}, $value, 0 ]}, 名称2:{$cond:[ {$eq:[$\u id.name,name2]}, $value, 0 ]}, 名称3:{$cond:[ {$eq:[$\u id.name,name3]}, $value, 0 ]}, }}, //$cond在其中放入了0个值。因此,请使用$group和$sum进行清理 {$组:{ _id:$\u id.userId, name1:{$sum:$name1}, name2:{$sum:$name2}, name3:{$sum:$name3} }} ]

因此,虽然额外的步骤会给您带来最终项目想要的结果,将_id更改为userId,但在我看来,短版本已经足够可行了,除非您确实需要它。也考虑从那里的输出:

{ _id:Objected53245016EA402B31D77B0372, 价值观:[ { 姓名:姓名3, 价值:2 }, { 姓名:姓名2, 数值:0 }, { 姓名:姓名1, 价值:150 } ] } 所以我个人会用这个。但这是你的选择