#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_