Mongodb 将属性收集为数组的Mongo DB

Mongodb 将属性收集为数组的Mongo DB,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我是Mongo数据库的新手: 我在一个集合中有一个文档,比如说有5个属性(a、B、C、D、E)。而且,集合中的文档包含上述所有或部分属性。我想写一个查询,它将附加所有文档中的属性值 Document 1 = {Id:123, data:{A:3, B:4, C:34, D:45, E:4}} Document 2 = {Id:123, data:{A:5, E:33}} Document 3 = {Id:123, data:{B:499, C:24, E:39}} Document 4 = {

我是Mongo数据库的新手: 我在一个集合中有一个文档,比如说有5个属性(a、B、C、D、E)。而且,集合中的文档包含上述所有或部分属性。我想写一个查询,它将附加所有文档中的属性值

Document 1 = {Id:123, data:{A:3, B:4, C:34, D:45, E:4}}
Document 2 = {Id:123, data:{A:5, E:33}}
Document 3 = {Id:123, data:{B:499, C:24,  E:39}}
Document 4 = {Id:123, data:{A:63, B:34, C:534, D:845, E:84}}
Document 5 = {Id:123, data:{E:4}}
对于ID123,我希望查询输出为 输出文件

{Id:123, A:[3,5,63], B:[4,499,34],C:[34,24,534],D:[45,845],E:[4,33,39,84,4]}
你可以试试这个

db.getCollection('Test02').aggregate([
    {$project: {Id: 1, data: { $objectToArray: "$data" } } },
    {$unwind: {path: "$data" } },
    {$group: { _id: { "Id": "$Id", "key": "$data.k"}, data: { $push:  "$data.v"  } } },
    {$group: { _id: "$_id.Id" , data: { $push:  {k:"$_id.key", v:"$data" } } } },
    {$project: {  data: { $arrayToObject: "$data" } } },
    {$replaceRoot: { newRoot: { $mergeObjects: [  {Id: "$_id"},  "$data" ] } } }
])
结果:

{
    "Id" : 123.0,
    "E" : [ 
        4.0, 
        33.0, 
        39.0, 
        84.0, 
        4.0
    ],
    "D" : [ 
        45.0, 
        845.0
    ],
    "C" : [ 
        34.0, 
        24.0, 
        534.0
    ],
    "A" : [ 
        3.0, 
        5.0, 
        63.0
    ],
    "B" : [ 
        4.0, 
        499.0, 
        34.0
    ]
}

只需按Id分组,将每个数据字段放入数组中

db.collection.aggregate([
  {
    $group: {
      _id: "$Id",
      A: {
        $push: "$data.A"
      },
      B: {
        $push: "$data.B"
      },
      C: {
        $push: "$data.C"
      },
      D: {
        $push: "$data.D"
      },
      E: {
        $push: "$data.E"
      }
    }
  }
])
将输出您所需的内容


您可以尝试这种方法:(1)在
Id
上分组,并将
数据
子文档值推送到一个数组中。然后,投影到reduce(使用
$reduce
数组操作符)以输出单个文档。注意:没有像
A:{3,5,63}
这样的格式;在MongoDB中,两种复合数据类型是子文档和数组。我想你是说它是一个数组,比如
A:[3,5,63]
。是的。我的错误。这是一个数组A:[3,5,63]无需缩减,分组将根据IdI输出一个唯一的文档。获取一个错误,$reduce是未知的$group运算符matthpen-我想根据输出进行连接。你能详细说明一下吗?非常感谢您的投入!为什么这么复杂?@matthPen,因为它是动态的。@SerkanArslan。谢谢。充分学习您的解决方案!