как преобразовать данные с помощью агрегатной функции mongodb

#mongodb

#mongodb

Вопрос:

Как преобразовать базу данных по parent_id в рамках самостоятельного объединения? Возможно ли это, чтобы результат соответствовал ожиданиям. Пожалуйста, помогите в этом, спасибо

 db={
  post: [
    {
      "_id": ObjectId("59f9c5629f75813e21a6fe34"),
      "parent_id": "0",
      "name": "main_category",
      "short_desc": "",
      "long_desc": "",
      "slug": "main_category",
      "status": true,
      "createdAt": ISODate("2017-11-01T13:00:18.714Z"),
      "updatedAt": ISODate("2019-02-19T07:31:20.967Z")
    },
    {
      "_id": ObjectId("59f9c5629f75813e21a6fe73"),
      "parent_id": "59f9c5629f75813e21a6fe34",
      "name": "sub_category",
      "short_desc": "",
      "long_desc": "",
      "slug": "sub_category",
      "status": true,
      "createdAt": ISODate("2017-11-01T13:00:18.714Z"),
      "updatedAt": ISODate("2019-02-19T07:31:20.967Z")
    },
    {
      "_id": ObjectId("59f9c5629f75813e21a6fe33"),
      "parent_id": "59f9c5629f75813e21a6fe73",
      "name": "sub_category1",
      "short_desc": "",
      "long_desc": "",
      "slug": "sub_category1",
      "status": true,
      "createdAt": ISODate("2017-11-01T13:00:18.714Z"),
      "updatedAt": ISODate("2019-02-19T07:31:20.967Z")
    }
  ]
}
  

вывод должен выглядеть следующим образом. Если какая-либо категория больше ни к чему не относится, она должна оставаться пустой

 [
  {
    mainCategory: 'main_category',
    subCategory1: 'sub_category',
    subCategory2: 'sub_category1',
    subCategory3: '',
    subCategory4: '',
    subCategory5: ''
  }, {
    mainCategory: '{if any}',
    subCategory1: '{if any}',
    subCategory2: '{if any}',
    subCategory3: '',
    subCategory4: '',
    subCategory5: ''
  }
];
  

Есть надежда получить эту статистику. ?

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

1. взгляните на $graphLookup

2. Можете ли вы, пожалуйста, создать mongoplayground, который поможет мне?

3. Моя попытка mongoplayground.net/p/cVEZH2EFYA8

4. Для этого может потребоваться изменение схемы, чтобы _id и parent_id были одного и того же типа данных.

5. любая идея, которую вы хотите мне сообщить, как это можно исправить?

Ответ №1:

$graphLookup считывает данные из коллекции, указанной в ее from аргументе, а не из документов в конвейере.

В конвейере, который вы создали для изменения типа данных, используйте этап $merge для обновления существующих документов:

 db.post.aggregate([
  {$addFields: {
      parent_oid: {
        $cond: {
          if: {$eq: ["$parent_id","0"]},
          then: "$parent_id",
          else: {$toObjectId: "$parent_id"}
        }
      }
    }
  },
  {$merge: "post"}
])
  

Затем вы можете использовать $graphLookup для формирования списков и преобразования их в нужную вам форму:

 db.post.aggregate([
  {$match: {parent_id: "0" }},
  {"$graphLookup": {
      "from": "post",
      "startWith": "$_id",
      "connectFromField": "_id",
      "connectToField": "parent_oid",
      "as": "response"
  }},
  {$unwind: "$response"},
  {$group: {
      _id: "$_id",
      main_category: {$first: "$slug"},
      subCategories: {$push: {
                              k: "$response.name",
                              v: "$response.slug"
      }}
    }
  },
  {$replaceRoot: {
      newRoot: {
        $mergeObjects: [
          {mainCategory: "$main_category"},
          {$arrayToObject: "$subCategories"}
        ]
      }
  }}
])
  

Вывод из образца данных:

 [
  {
    "mainCategory": "main_category",
    "sub_category": "sub_category",
    "sub_category1": "sub_category1"
  }
]
  

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

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

1. Потрясающе! но что, если я добавлю еще одну новую категорию с parent_id: 0 mongoplayground.net/p/gCTn1Lo_OVi

2. Эта агрегация зависит от того, обновите ли вы документы, чтобы они имели форму ObjectId родительского идентификатора. Как написано, он не вернет никаких «основных» категорий, у которых нет подкатегорий, но вы можете получить их в результате, используя preserverNullAndEmptyArrays опцию с $unwind этапом и $cond для запуска $arrayToObject только в том случае, если массив не пуст.

3. Извините, я новичок в mongo, я получаю эту ошибку: mongoplayground.net/p/zrIGmAidlKR

4. [ { «mainCategory»: «main_category», «sub_category»: «sub_category», «sub_category1»: «sub_category1» },{ «mainCategory»: «main_category», «sub_category»: «sub_category», «sub_category1»: «sub_category1» }, { «new_category»: «new_category» } ]

5. Пара изменений в вашем условном, также обратите внимание, что эта агрегация предполагает, что вы уже обновили все свои документы, чтобы иметь parent_oid поле, которое является идентификатором объекта, созданным из parent_id строки. mongoplayground.net/p/7X7ETrWJ-l_