У меня две коллекции Users и Notes. Обе коллекции содержат свойство id, а коллекция Notes имеет userid, который является идентификатором некоторого пользователя в коллекции Users.
Теперь я пытаюсь объединить (объединить) некоторую пользовательскую информацию в Notes:
db.getCollection("Notes").aggregate(
{
"$lookup": {
"from": "Users",
"let": {
"idForeignField": "$id"
},
"pipeline": [
{
"$match": {
"$expr": {
"$and": [{
"$eq": ["$userid", "$$idForeignField"]
}]
}
}
}
],
"as": "Users#joined"
}
}
);
Что я получаю в пустом массиве Users#joined. Почему? Разве мой запрос не должен работать? Проблема вызвана тем, что обе коллекции имеют свойство id? Если да, как я могу сказать let и match какая коллекция правильная?
Обновлять: в качестве альтернативы отлично работает более простой запрос:
db.getCollection("Notes").aggregate(
{
$lookup:
{
from: "Users",
localField: "userid",
foreignField: "id",
as: "Users#joined"
}
}
);
Однако я хотел бы сделать это с помощью let и конвейера, чтобы добавить больше условий match.
Спасибо.

Ваша переменная let должна быть userid
db.getCollection("Notes").aggregate([
{ "$lookup": {
"from": "Users",
"let": { "ifForeignField": "$userid" },
"pipeline": [
{ "$match": { "$expr": { "$and": [{ "$eq": ["$id", "$$ifForeignField"] }] }}}
],
"as": "Users#joined"
}}
])