Wiem, że musimy rozwinąć tablicę przed użyciemwyszukiwanie, ale czy jest jakiś sposób na rozwinięcie tablicy na innym dokumencie przed przeprowadzeniem wyszukiwania? W tej chwili właśnie otrzymuję pełną tablicę, w której znajduje się wartość.
Jako alternatywne rozwiązanie, w jaki sposób chciałbyś filtrować pełną tablicę, aby zachowała tylko wartość, do której odwołuję się w każdym dokumencie?
EDYTOWAĆ: Jako przykład
COLLECTION AAA
{
array:[
{_id:01},
{_id:02}
]
}
COLLECTION BBB
{
array:[
{AAA_id:01},
{AAA_id:02}
]
}
W tym przykładzie użyję tego kodu do pobrania powiązanych wartości:
db.BBB.aggregate(
{$unwind: "$array"},
{
$lookup:
{
from: "AAA",
localField: "array.AAA_id",
foreignField: "array._id",
as: "linked"
}
}
)
Ale dostawałbym coś takiego:
{
array:[
{AAA_id:01}
]
linked:[
{_id:01},
{_id:02}
]
}
{
array:[
{AAA_id:02}
]
linked:[
{_id:01},
{_id:02}
]
}
Zamiast tego:
{
array:[
{AAA_id:01}
]
linked:[
{_id:01}
]
}
{
array:[
{AAA_id:02}
]
linked:[
{_id:02}
]
}
Odpowiedzi:
2 dla odpowiedzi № 1$ lookup pobiera pełny dokument z dopasowanymi kryteriami. W tym konkretnym przypadku, aby pozbyć się niepotrzebnych elementów, można użyć $ filter w $ potoku projektu, podobnie jak w przypadku:
$project : {
_id : 1, //list all field here
linked: {
$filter : {
input : "$linked",
as : "item",
cond : {
$eq : ["$$item._id", "$$array.AAA_id"]
}
}
}
},
AFAIK nie ma jeszcze innego wyjścia.