Il s'agit d'une idée fausse standard et compréhensible de tableau de tableaux avec MongoDB. Les critères de requête produiront le résultat approprié dans la portée d'un document , pas nécessairement juste les éléments d'un tableau que vous recherchez. En d'autres termes, compte tenu de votre objectif de recherche de DATA NOT FOUND
, la plupart des requêtes simples trouveront tout document auquel au moins un élément du tableau correspond, mais ne filtreront pas ceux qui ne correspondent pas. Il faut être un peu plus complexe pour faire ça d'un coup :
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"] }
}}
}
}}
}}
]);