C'est toujours une bonne idée d'être conscient des ressources mémoire quand $unwind
en raison de la réplication des données qui se produit.
Utilisation de $match
limiter les résultats aux documents spécifiques que vous recherchez est bien sûr un moyen de réduire la quantité de mémoire nécessaire pour contenir les données renvoyées.
Une autre façon de réduire l'empreinte mémoire consiste à utiliser $project
. $project
vous permet de réorganiser les documents dans le pipeline afin de ne renvoyer que les éléments qui vous intéressent.
Pour reprendre votre exemple,
{
someInfo: "blah blah blah",
answers: [
{
email: "[email protected]",
values: [
{value: 1, label: "test1"},
{value: 2, label: "test2"}
]
},
{
email: "[email protected]",
values: [
{value: 6, label: "test1"},
{value: 1, label: "test2"}
]
}
]
}
Avec
db.collection.aggregate([{ $match: { <element>: <value> }}, { $project: { _id: 0, answers: 1}}])
supprimera le someInfo
et d'autres attributs qui ne vous intéressent peut-être pas. Ensuite, vous pouvez $project
à nouveau après s'être détendu...
db.collection.aggregate([
{ $match: { <element>: <value> }},
{ $project: { _id: 0, answers: 1}},
{ $unwind: "$answers"},
{ $unwind: "$answers.tags"},
{ $project: { e: "$answers.email", v: "$answers.values"}}
])
renverra des résultats assez compacts comme :
{ e: "[email protected]", v: { value: 1, label: "test1" } }
{ e: "[email protected]", v: { value: 2, label: "test2" } }
{ e: "[email protected]", v: { value: 6, label: "test1" } }
{ e: "[email protected]", v: { value: 1, label: "test2" } }
Bien que les noms d'attribut à une seule lettre réduisent la lisibilité humaine, cela réduit la taille des données qui sont gonflées par de longs noms d'attribut répétés.