Как сгруппировать вложенные объекты в массив в mongodb - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть документы, структурированные в этой форме:

Item:[{
  product:"shovel"
  price: 100
  dateAdded: 2018-11-28 18:28:12.356
 }
 {
  product:"wheel barrow"
  price: 500
  dateAdded: 2018-11-28 18:28:12.357
 }
 {
  product:"Boot"
  price: 500
  dateAdded: 2018-11-29 18:29:12.357
 }
]

, и я хочу сгруппировать объекты в массиве на основе дня, когда они были добавлены, т. Е. Создать форму:

Item:[
 [
  {

  product:"Shovel"
  price: 100
  dateAdded: 2018-11-28 18:28:12.356
 }
 {
  product:"Wheel barrow"
  price: 500
  dateAdded: 2018-11-28 18:28:12.357
 }
 ]
 [
  {
   product:"Boot"
   price: 500
   dateAdded: 2018-11-29 18:29:12.357
 }
 ]
]

любая идея запроса агрегации с использованием mongodb

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете группировать по $dayOfYear и использовать $dateFromString, чтобы получить дату от вашего string, например:

db.collection.aggregate([
  {
    "$group": {
      "_id": {
        $dayOfYear: {
          $dateFromString: {
            dateString: "$dateAdded"
          }
        }
      },
      "data": {
        "$push": "$$CURRENT"
      }
    }
  },
  {
    $project: {
      _id: 0
    }
  }
])

Результат будет выглядеть так:

[
  {
    "data": [
      {
        "_id": ObjectId("5a934e000102030405000002"),
        "dateAdded": "2018-11-29 18:29:12.357",
        "price": 500,
        "product": "Boot"
      }
    ]
  },
  {
    "data": [
      {
        "_id": ObjectId("5a934e000102030405000000"),
        "dateAdded": "2018-11-28 18:28:12.356",
        "price": 100,
        "product": "shovel"
      },
      {
        "_id": ObjectId("5a934e000102030405000001"),
        "dateAdded": "2018-11-28 18:28:12.357",
        "price": 500,
        "product": "wheel barrow"
      }
    ]
  }
]

Которые вы можете затем сгладить тривиально с помощью JS и Array.reduce и т. Д.

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