Mon go DB собирает свойства в виде массива - PullRequest
2 голосов
/ 24 марта 2020

Я новичок в базе данных Mon go: у меня есть документ в коллекции, скажем, с 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]}

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Вы можете попробовать это.

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
    ]
}
0 голосов
/ 24 марта 2020

Просто сгруппируйте по 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"
      }
    }
  }
])

выведет именно то, что вам нужно

Пн go детская площадка

...