Je sais que nous devons dérouler un tableau avant d'utiliserrecherche, mais existe-t-il un moyen de dérouler le tableau sur l'autre document avant d'effectuer la recherche? À l’heure actuelle, j’obtiens tout le tableau où la valeur est incluse.
Comme solution alternative, comment filtreriez-vous l’ensemble du tableau afin de ne conserver que la valeur de référence sur chaque document?
MODIFIER: Par exemple
COLLECTION AAA
{
array:[
{_id:01},
{_id:02}
]
}
COLLECTION BBB
{
array:[
{AAA_id:01},
{AAA_id:02}
]
}
Dans cet exemple, je voudrais utiliser ce code pour récupérer les valeurs liées:
db.BBB.aggregate(
{$unwind: "$array"},
{
$lookup:
{
from: "AAA",
localField: "array.AAA_id",
foreignField: "array._id",
as: "linked"
}
}
)
Mais je voudrais obtenir quelque chose comme ça:
{
array:[
{AAA_id:01}
]
linked:[
{_id:01},
{_id:02}
]
}
{
array:[
{AAA_id:02}
]
linked:[
{_id:01},
{_id:02}
]
}
Au lieu de cela:
{
array:[
{AAA_id:01}
]
linked:[
{_id:01}
]
}
{
array:[
{AAA_id:02}
]
linked:[
{_id:02}
]
}
Réponses:
2 pour la réponse № 1$ lookup récupère le document complet avec les critères correspondants. Dans ce cas particulier, pour éliminer les éléments inutiles, vous pouvez utiliser $ filter dans le pipeline $ project, comme ceci:
$project : {
_id : 1, //list all field here
linked: {
$filter : {
input : "$linked",
as : "item",
cond : {
$eq : ["$$item._id", "$$array.AAA_id"]
}
}
}
},
Pour autant que je sache, il n’ya pas d’autre solution possible pour le moment.