Найти документы, соответствующие ObjectID в чужом массиве - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть коллекция Users:

{
  _id: "5cds8f8rfdshfd"
  name: "Ted"
  attending: [ObjectId("2cd9fjdkfsld")]
}

У меня есть другая коллекция Events:

{
  _id: "2cd9fjdkfsld"
  title: "Some Event Attended"
},
{
  _id: "34dshfj29jg"
  title: "Some Event NOT Attended"
}

Я хотел бы вернуть список всех событий, на которых присутствовалданный пользователь.Однако мне нужно выполнить этот запрос из коллекции Events, так как это часть более крупного запроса.

Я прошел следующие вопросы:

Я пробовал различные способы изменения приведенных выше ответов в соответствии с моей ситуацией, но безуспешно. второй ответ из третьего вопроса приближает меня, но я бы хотел отфильтровать несопоставимые результаты, а не возвращать их со значением 0.

Мой желаемый результат:

[
  {
    _id: "2cd9fjdkfsld"
    title: "Some Event Attended"
  },
]

1 Ответ

0 голосов
/ 21 февраля 2019

Один из вариантов будет выглядеть следующим образом:

db.getCollection('Events').aggregate({
    $lookup: // join
    {
        from: "Users", // on Users collection
        let: { eId: "$_id" }, // keep a local variable "eId" that points to the currently looked at event's "_id"
        pipeline: [{
            $match: { // filter where
                "_id": ObjectId("5c6efc937ef75175b2b8e7a4"), // a specific user
                $expr: { $in: [ "$$eId", "$attending" ] } // attends the event we're looking at
            }
        }],
        as: "users" // push all matched users into the "users" array
    }
}, {
    $match: { // remove events that the user does not attend
        "users": { $ne: [] }
    }
})

Очевидно, что вы можете избавиться от поля users, добавив еще одну проекцию, если это необходимо.

...