$ lookup, когда foreignField является массивом - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть 2 коллекции, в первой хранятся аниме, просмотренные каждым пользователем, их статус и т. Д .:

const listSchema = mongoose.Schema({
  user: {
    type: Schema.Types.ObjectId,
    ref: 'user'
  },
  animes: [{
    _id: false,
    anime: {
      type: Schema.Types.ObjectId,
      ref: 'anime',
      unique: true
    },
    status: String,
    episodes: Number,
    rating: Number
  }]
});

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

Я пробовал следующее:

Anime.aggregate([
    {
      $lookup: {
        'from': 'lists',
        localField: '_id',
        foreignField: 'animes.anime',
        'as': 'name'
      },
    },
    {
      $unwind: '$animes'
    },
    {
      $project:{
        status:'$lists.animes.status'
      }
    }
  ]
)

, ноон возвращает пустой массив.Я также не знаю, как фильтровать по userId, видя, как _id находится в чужой коллекции.

1 Ответ

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

Вы можете использовать ниже агрегации

{ "$lookup": {
  "from": "lists",
  "let": { "id": "$_id" },
  "pipeline": [
    { "$match": { "$expr": { "$in": ["$$id", "$animes.anime"] }}},
    { "$unwind": "$animes" },
    { "$match": { "$expr": { "$eq": ["$animes.anime", "$$id"] }}}
  ],
  "as": "name"
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...