Задать вопрос

Как сделать глубокую фильтрацию по populate?

Есть модель вида

const BookSchema = new Schema({
  title: {
    type: String
  },
  lists: [
    {
      type: Schema.Types.ObjectId,
      ref: 'lists'
    }
  ]
})


В свою очередь модель указанного ref выглядит так:
const ListSchema = new Schema({
  title: {
    type: String
  },
  sublists: [
    {
      title: {
        type: String,
        required: false
      },
      contents: [
        {
          book: {
            type: Schema.Types.ObjectId,
            ref: 'book',
            required: false
          },
          comment: {
            type: String
            required: false
          }
        }
      ]
    }
  ]
})


Т.е. если получить документ, к которому прикреплены эти рефовые списки, то получится такая структура
{
  title: 'Collection title',
  lists: [
    {
      title: 'List title',
      sublists: [
        {
          title: 'Sublist title 1',
          contents: [
            {
              book: '610870e5a5f74d036c37041d',
              comment: 'Some comment 1-1'
            },
            {
              book: '610870e5a5f74d036c37041g',
              comment: 'Some comment 1-2'
            }
          ]
        }
      ]
    }
  ]
}


Как мне получить посредством populate (или, может, еще как-то) не только список, с которым связан первый документ, но и title с _id его подсписка, т.е. найти документ внутри lists > sublists > contents и вернуть, например, что-то вроде

{
  title: 'Document title',
  lists: [
    {
      title: 'List title',
      sublists: [
        {
          title: 'Sublist title'
        }
      ]
    }
  ]
}


Т.е. отфильтровать и вернуть списки и подсписки, в которых искомый документ встречается.
При этом искомый документ может находиться в нескольких списках и подсписках.

Пробовал делать так:
const book = await Book.findById(id)
  .populate({ path: 'lists', select: ['title', '_id'], match: {sublists: {contents: {book: {$eq: id}}}} })


Но возвращается ошибка
message: "Cast to ObjectId failed for value \"{ '$eq': '610870e5a5f74d036c37041d' }\" (type Object) at path \"book\" because of \"BSONTypeError\""


Как правильно сделать то, что требуется?
  • Вопрос задан
  • 49 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы