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: "example@sqldat.com",
values: [
{value: 1, label: "test1"},
{value: 2, label: "test2"}
]
},
{
email: "example@sqldat.com",
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: "example@sqldat.com", v: { value: 1, label: "test1" } }
{ e: "example@sqldat.com", v: { value: 2, label: "test2" } }
{ e: "example@sqldat.com", v: { value: 6, label: "test1" } }
{ e: "example@sqldat.com", 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.