Как извлечь данные из массива состояния - PullRequest
1 голос
/ 20 апреля 2020

Hy, я использую Compass в качестве инструмента для MongoDb.

Теперь у меня есть массив с действительными статусами для продукта, и как только продукт получает новый статус, я добавляю его в ' массив статуса.

Мне нужно извлечь объект с датами, когда каждое состояние было добавлено в массив, см. Образец ниже:

{
   _id: ObjectId("5e8f7ddb4af84bbb7431bc61"),
   Status: [`enter code here`
    {
        _id: ObjectId("5e8f7ddb4af84bbb7431bc62"), 
        Last: 'Added',
        Date: '2020-04-20 08:30:00'
    },
    {
        _id: ObjectId("5e8f7ddb4af84bbb7431bc63"),
        Last: 'Proccessed',
        Date: '2020-04-20 09:30:00'
    },
    {
        _id: ObjectId("5e8f7ddb4af84bbb7431bc64"),
        Last: 'Concluded',
        Date: '2020-04-20 14:00:00'
    },
    {
        _id: ObjectId("5e8f7ddb4af84bbb7431bc65"),
        Last: 'Finished',
        Date: '2020-04-20 14:30:00'
    }
   ]
}    

Мне нужно извлечь массив объекта для каждый такой продукт:

[{
   _id: ObjectId("5e8f7ddb4af84bbb7431bc61"),
  Added: '2020-04-20 08:30:00',
  Proccessed: '2020-04-20 09:30:00',
  Concluded: '2020-04-20 14:00:00',
  Finished: '2020-04-20 14:30:00
}]

Как мне добиться этого с помощью агрегации? Заранее благодарим за помощь.

1 Ответ

0 голосов
/ 20 апреля 2020

Обычно вам нужно $ arrayToObject для создания динамически оцененных свойств и $ replace Root для продвижения вашего пользовательского объекта до root leve:

db.collection.aggregate([
    {
        $replaceRoot: {
            newRoot: {
                $mergeObjects: [
                    { _id: "$_id" },
                    {
                        $arrayToObject: { $map: { input: "$status", in: { k: "$$this.Last", v: "$$this.Date" } } }
                    }
                ]
            }
        }
    }
])

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...