यह MongoDB के साथ एक मानक और समझने योग्य सरणी की गलत धारणा है। क्वेरी मानदंड दस्तावेज़ . के दायरे में उचित परिणाम देगा , जरूरी नहीं बस एक सरणी में आइटम जिसे आप ढूंढ रहे हैं। दूसरे शब्दों में, DATA NOT FOUND
. खोजने का आपका वांछित लक्ष्य दिया गया है , सबसे सरल प्रश्नों में कोई भी दस्तावेज़ मिलेगा जहां सरणी में कम से कम एक आइटम मेल खाता है - लेकिन उन लोगों को फ़िल्टर नहीं करेगा जो नहीं करते हैं। इसे एक बार में करने के लिए आपको थोड़ा और जटिल होना होगा:
db.foo.aggregate([
// Make sure at *least* one label has a remark of DATA NOT FOUND;
// otherwise, the $filter trick in the next stage yields a labels array
// of length 0 (which is not horrible). Also, this is a good place to
// add other $match criteria, possibly index-optimized, to shrink down the
// size of response set:
{$match: {"divisionIn.sections.labels.remarks":"DATA NOT FOUND"}}
,{$project: {
// Copy over the main doc level things we want:
projectDR: "$projectDR",
code: "$code",
status: "$status"
// divisionIn is a map, not an array, so we can dive down using dot notation
// and make a new sections array called divSections that will ONLY have
// DATA NOT FOUND:
divSections: {$map: {input: "$divisionIn.sections", as:"z", in:
{
// Again, copy over things we want to keep; may not need all of them
"sectionNumber": "$$z.sectionNumber",
"sectionName": "$$z.sectionName",
// The Juice: Copy BUT FILTER the labels field conditionally based on
// the value of labels.remarks:
"labels": {$filter: {input: "$$z.labels",
as: "z2",
cond: {$eq: [ "$$z2.remarks", "DATA NOT FOUND"] }
}}
}
}}
}}
]);