Объединение объектов с $ pu sh в агрегат MongoDB - PullRequest
0 голосов
/ 21 марта 2020

У меня есть следующий агрегат:

[ 
  { $unwind: "$stocks" },
  { $sort: { date: 1 } },
  { $group:
    { 
      _id: { userId: "$userId", productId: "$stocks.productId" },
      stock: { $last: "$stocks" },
      lastDate: { $last: "$date" }
    }
  },
  {
    $group: {
      _id: "$_id.userId",
      stocks: { $push: { stock: "$stock", lastDate: "$lastDate" } }
    }
  }
]

Он генерирует эти документы:

{
  "_id": "5e75f498359fc8159d5b6075",
  "stocks": [
    {
      "stock": {
        "productId": "5e75eae1359fc8159d5b6073",
        "quantity": 20
      },
      "lastDate": "2020-03-21T16:21:14.008Z"
    },
    {
      "stock": {
        "productId": "5e75eaea359fc8159d5b6074",
        "quantity": 1
      },
      "lastDate": "2020-03-21T15:59:31.615Z"
    }
  ]
}

Он работает хорошо, но я хочу, чтобы все позиции в запасах были "1-го уровня" deep:

{
  "_id": "5e75f498359fc8159d5b6075",
  "stocks": [
    {
      "productId": "5e75eae1359fc8159d5b6073",
      "quantity": 20
      "lastDate": "2020-03-21T16:21:14.008Z"
    },
    {
      "productId": "5e75eaea359fc8159d5b6074",
      "quantity": 1
      "lastDate": "2020-03-21T15:59:31.615Z"
    }
  ]
}

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

РЕДАКТИРОВАТЬ: Вот образец документа:

{
  "_id": ObjectId("5e7604e8645bb946e7eba6b5"),
  "date": "2020-03-21T12:13:28.355Z",
  "userId": ObjectId("5e75d985359fc8159d5b6072"),
  "stocks": [
    {
      "productId": ObjectId("5e75eae1359fc8159d5b6073"),
      "quantity": 5
    },
    {
      "productId": ObjectId("5e75eaea359fc8159d5b6074"),
      "quantity": 5
    }
  ]
}

1 Ответ

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

Измените свой последний $group на этот:

{
  $group: {
    _id: "$_id.userId",
    stocks: {
      $push: {
        $mergeObjects: [
          "$stock",
          {
            "lastDate": "$lastDate"
          }
        ]
      }
    }
  }
}

MongoPlayground

...