Как отфильтровать агрегацию поиска по ссылкам ObjectId и вернуть весь документ в MongodDB - PullRequest
0 голосов
/ 25 июня 2019

Я разрабатываю систему тикетов, и мне нужно отфильтровать события с заданными свойствами.

Моя модель событий такая.

const Event = new mongoose.Schema({
  name: String,
  slug: String,
  venue: {
    type: mongoose.Schema.Types.ObjectId,
    ref: venue.modelName,
  },
  promoters: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: promoter.modelName,
  }],
  artists: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: artist.modelName,
  }],
});

Моя модель объекта такая

const Venue = new mongoose.Schema({
  name: String,
  slug: String,
  tags: [String],
  capacity: Number,
  promoters: [{
    type: mongoose.SchemaTypes.ObjectId,
    ref: promoter.modelName,
  }],
});

Я написал поисковый запрос

db.getCollection("events").aggregate([
// Lookup for venues
{ "$lookup": {
  "from": "venues",
  "localField": "venue",
  "foreignField": "_id",
  "as": "venue"
}},{"$unwind":"$venue"},

// Lookup for promoters.
{"$unwind":"$promoters"},
{ "$lookup": {
  "from": "promoters",
  "localField": "promoters",
  "foreignField": "_id",
  "as": "promoters"
}},

// Lookup for artists.
{"$unwind":"$promoters"},
{ "$lookup": {
  "from": "artists",
  "localField": "artists",
  "foreignField": "_id",
  "as": "artists"
}},
])

, чтобы все объекты работали нормально.

Когда я изменяю поисковый запрос художника на

// Lookup for artists.
{"$unwind":"$artists"},
{ "$lookup": {
  from: 'artists',
  as: 'artists',
  let: { artist: '$artist._id' },
  pipeline: [
    { $match: {
        $expr: { $eq: ['$slug', 'artist-1'] },
      }
    }
  ]
}},

MongoDB возвращает дубликаты результатов, когда художники показывают только «Artist-1».

Как получить события, содержащие Artist-1, и просмотреть всех исполнителей с этим событием?

...