आप अपनी एकत्रीकरण पाइपलाइन की शुरुआत से ही गलती कर रहे हैं
$project: {
"tasks" : 1
}
जिससे आप अपना सारा डेटा खो देते हैं। तो सबसे पहले आपको इसे आरक्षित करने की आवश्यकता है:
$project: {
tasks: 1,
doc: {
title: "$title",
order: "$order",
description: "$description",
status: "$status"
}
}
बाद में अपना $अनविंड
करें s जैसा आप अपने प्रश्न में करते हैं:
{$unwind: "$tasks"}, {$unwind: "$tasks.subTasks"}
फिर छँटाई करें। आपको मिश्रित कुंजियों के साथ छँटाई करने की आवश्यकता है, अन्यथा tasks.subTasks.order
द्वारा क्रमित करना जैसे ही आप tasks.order
. के आधार पर छाँटेंगे, होल्ड नहीं होगा . तो:
{$sort: {"tasks.order": -1, "tasks.subTasks.order": 1}}
और फिर कठिन हिस्सा आता है। आपको $group
. की आवश्यकता है परिणामों को वापस करें, और पहला कदम $पुश
. है उप-कार्य
को वापस करें , लेकिन सबसे पहले, आपको फिर से कार्य विशेषताओं को संरक्षित करने की आवश्यकता है:
$project: {
doc: 1,
task_id: "$tasks._id",
tasks_doc: {
title: "$tasks.title",
description: "$tasks.description",
order: "$tasks.order",
status: "$tasks.status"
},
subTasks: "$tasks.subTasks"
}
...उपकार्य
एकत्र करें :
$group: {
_id: {
_id: "$_id",
task_id: "$task_id",
doc: "$doc",
task_doc: "$tasks_doc"
},
subTasks: {
$push: "$subTasks"
}
}
और वही कार्यों
. के लिए . ध्यान दें कि $group
. के दौरान आपको task_doc
. को वापस प्रोजेक्ट करने की भी आवश्यकता है विशेषताएँ:
$group: {
_id: {
_id: "$_id._id",
doc: "$_id.doc"
},
tasks: {
$push: {
_id: "$_id.task_id",
title: "$_id.task_doc.title",
description: "$_id.task_doc.description",
order: "$_id.task_doc.order",
status: "$_id.task_doc.status"
subTasks: "$subTasks"
}
}
}
और फिर रूट को वापस प्रोजेक्ट करें doc
विशेषताएँ:
$project: {
_id: "$_id._id",
title: "$_id.doc.title",
description: "$_id.doc.description",
order: "$_id.doc.order",
status: "$_id.doc.status",
tasks: 1
}
मूल रूप से यही है। यहां पूरी कच्ची एकत्रीकरण पाइपलाइन है, ताकि आप परीक्षण कर सकें और देख सकें कि आपको वांछित परिणाम मिलता है या नहीं:
[
{$match: {_id: ObjectId("554a13d4b692088a38f01f3b")}},
{$project: {tasks: 1, doc: {title: "$title", order: "$order", description: "$description", status: "$status"}}},
{$unwind: "$tasks"},
{$unwind: "$tasks.subTasks"},
{$sort: {"tasks.order": -1, "tasks.subTasks.order": 1}},
{$project: {doc: 1, task_id: "$tasks._id", tasks_doc: {title: "$tasks.title", description: "$tasks.description", order: "$tasks.order", status: "$tasks.status"}, subTasks: "$tasks.subTasks"}},
{$group: {_id: {_id: "$_id", task_id: "$task_id", doc: "$doc", task_doc: "$tasks_doc"}, subTasks: {$push: "$subTasks"}}},
{$group: {_id: {_id: "$_id._id", doc: "$_id.doc"}, tasks: {$push: {_id: "$_id.task_id", title: "$_id.task_doc.title", description: "$_id.task_doc.description", order: "$_id.task_doc.order", status: "$_id.task_doc.status", subTasks: "$subTasks"}}}},
{$project: {_id: "$_id._id", title: "$_id.doc.title", description: "$_id.doc.description", order: "$_id.doc.order", status: "$_id.doc.status", tasks: 1}}
]
अपडेट करें
यदि कोई सरणी फ़ील्ड खाली है या मौजूद नहीं है (null
है) ) $अनविंड
उस फ़ील्ड पर ऑपरेशन खाली परिणाम लौटाएगा
. इस स्थिति का समाधान प्रारंभ में null
. की स्थापना कर रहा है /खाली फ़ील्ड से कुछ शून्य
मूल्य, उदा. "<खाली-सरणी>"
. ध्यान दें, आपको यह करना है $project
प्रत्येक सरणी के लिए आयन, उसके $अनविंड
. से पहले ।
इस उत्तर
पर एक नज़र डालें $ifNull
. का उपयोग करने के तरीके के बारे में ऑपरेटर। $size
भी देखें ऑपरेटर यहां
।
इस भाग से निपटने के बाद, आपको $group
. की आवश्यकता है परिणामों को वापस करें, और इसे <का उपयोग करके प्राप्त किया जा सकता है। कोड>$cond ऑपरेटर
, "<खाली-सरणी>"
. के विरुद्ध जाँच करने के लिए मूल्य