Мангуст: как группировать по значениям и хранить в отдельных массивах

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Я использую мангуст для запроса моих видеоданных, и это то, что я получаю в ответ

 {
  "data": [
    {
      "_id": "5f4e1bcc39d8e31964c662b2",
      "is360": false,
      "ratingAllowed": true,
      "commentAllowed": false,
      "keywords": [
        "test",
        "cat",
        "train"
      ],
      "genre": [
        "classical"
      ],
      "similarVideos": [],
      "adultLanguage": false,
      "isDeleted": false,
      "isPublished": true,
      "category": "favouriteinfluncer",
      "influencerId": "5f3b7a7ac1d21a26b808b97c",
      "title": "another test video",
      "description": "Testing testing"
    },
    {
      "_id": "5f4f8d127bc7453654c9b88e",
      "keywords": [
        "ganesh",
        "drawing"
      ],
      "genre": [
        "classical"
      ],
      "similarVideos": [
        "5f4c9522c8d42f0b5a24b9da"
      ],
      "adultLanguage": false,
      "isDeleted": false,
      "isPublished": true,
      "category": "popularvideo",
      "influencerId": "5ee4535219c8037fc3c53959",
      "title": "Drawing",
      "description": " Drawing - Handmade pencil drawing"
    }
    ... array of video objects
  ]
}
  

Я хочу сгруппировать свой ответ в соответствии с такими категориями, как

 {
    “popularvideo”:[{
        video1data
    }, {
        video2data
    }, and so on],
    “other category”:[{
        video1data
    }, {
        video2data
    }, and so on],
    and so on
}
  

Я пробовал группировать с помощью .aggregate() и $group . Я смог сгруппировать ответ, но не смог получить массив видео для этой конкретной категории. Как я могу упорядочить массив видеообъектов по категориям.

Ответ №1:

Вы можете сделать это так,

  • $group с помощью category и вставьте документ в videos поле
  • $group с помощью null создайте корневой массив по k и v, потому что ниже мы преобразуем в ключ и значение
  • $replaceWith для замены корневого документа после преобразования $arrayToObjet
 db.collection.aggregate([
  {
    $group: {
      _id: "$category",
      videos: { $push: "$$ROOT" }
    }
  },
  {
    $group: {
      _id: null,
      videos: {
        $push: {
          k: "$_id",
          v: "$videos"
        }
      }
    }
  },
  {
    $replaceWith: { $arrayToObject: "$videos" }
  }
])
  

Игровая площадка

Комментарии:

1. спасибо, это то, что я хотел. Я настолько новичок, что не знал о $replaceWith и $ arrayToObject. 😀

2. добавлена справочная ссылка для этого, вы можете узнать больше об этом.

3. что, если у меня есть поле ObjectId videoId внутри видеоданных? Как мне его заполнить? я попытался использовать $lookup, но получил пустой ответ

4. преобразуйте этот идентификатор строки в идентификатор объекта, используя $toObjectId .

5. Я думаю, что я использовал $lookup неправильный путь. Я писал $lookup после $replaceWith , которое давало мне пустой ответ. Но когда я писал это в начале, он заполнял мой ObjectId. Но спасибо за предложение. 😄