Как сделать поиск поля «Автор» для различных массивов в mongodb? - PullRequest
0 голосов
/ 14 апреля 2020

Моя проблема в том, что я хочу сделать поиск поля «Автор» для массива объектов «Обзоры», «Подписчики» и «Наблюдение», но я не знаю, почему он дает мне этот результат в других В массивах это значение повторяется столько же раз, сколько документов в массиве «Обзоры».

  .unwind({ path: '$reviews', preserveNullAndEmptyArrays: true })
  .lookup({
    from: 'users',
    let: { userId: '$reviews.author' },
    pipeline: [
      { $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
      {
        $project: {
          name: 1,
          username: 1,
          photo: 1,
          rank: 1,
          'premium.status': 1,
          online: 1,
        },
      },
    ],
    as: 'reviews.author',
  })
  .unwind({ path: '$followers', preserveNullAndEmptyArrays: true })
  .lookup({
    from: 'users',
    let: { userId: '$followers.author' },
    pipeline: [
      { $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
      {
        $project: {
          name: 1,
          username: 1,
          photo: 1,
          rank: 1,
          'premium.status': 1,
          online: 1,
        },
      },
    ],
    as: 'followers.author',
  })
  .unwind({ path: '$watching', preserveNullAndEmptyArrays: true })
  .lookup({
    from: 'users',
    let: { userId: '$watching.author' },
    pipeline: [
      { $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
      {
        $project: {
          name: 1,
          username: 1,
          photo: 1,
          rank: 1,
          'premium.status': 1,
          online: 1,
        },
      },
    ],
    as: 'watching.author',
  })
  .group({
    _id: '$_id',
    data: {
      $first: '$$ROOT',
    },
    reviews: {
      $push: '$reviews',
    },
    followers: {
      $push: '$followers',
    },
    watching: {
      $push: '$watching',
    },
  })

Это результат, когда «Обзоры» имеют документы:

This is the result when

Массив «Подписчики / Наблюдения» не имеет ничего в базе данных, но он показан здесь таким образом, повторяя это значение столько же, сколько документов в рецензиях Я не знаю, что происходит.

И когда все массивы пусты, это происходит:

And when all arrays are empty, this happens

Это продолжает показывать это, но я не знаю, как его починить.

В итоге, "Отзывы", "Наблюдение" и "Подписчики" имеют поле "Автор", и я хочу сделайте поиск в поле просмотра автора, а также для подписчиков и отзывов, но у меня есть эти проблемы. Пожалуйста, мне нужна помощь.

Пример: Вот как это выглядит в базе данных:

Example: This is how it looks in the database

Спасибо Вы очень заранее.

1 Ответ

0 голосов
/ 14 апреля 2020

Этап $unwind создает новый документ для каждого элемента в массиве, который вы раскручиваете. Каждый новый документ будет содержать копию всех других полей в документе.

Если исходный документ выглядит как

{
  _id: "unique",
  Array1:["A","B","C"],
  Array2:["D","E","F"],
}

После размотки «Массив1» в конвейере будет 3 документа :

[
 {
   _id: "unique",
   Array1:"A",
   Array2:["D","E","F"]
 },{
   _id: "unique",
   Array1:"B",
   Array2:["D","E","F"]
 },{
   _id: "unique",
   Array1:"C",
   Array2:["D","E","F"]
 }
]

Тогда раскручивая «наблюдатели», вы развернете каждый массивов наблюдателей, так что у вас будет декартово произведение массивов. Детская площадка

В вашем случае исходный документ имеет 2 рецензии, но нет подписчиков и наблюдателей, поэтому в начале конвейера содержится один документ, аналогичный:

[
  {
    _id: "ObjectId",
    data: "other data"
    reviews: [{content:"review1", author:"ObjectId"},
              {content:"review2", author:"ObjectId"}]
  }
]

После первого отката у вас есть 2 документа:

[
  {
    _id: "ObjectId",
    data: "other data"
    reviews: {content:"review1", author:"ObjectId"}
  },
{
    _id: "ObjectId",
    data: "other data"
    reviews: {content:"review2", author:"ObjectId"}
  }
]

При первом поиске идентификатор автора заменяется данными для каждого документа, затем ко всем документам применяется вторая раскрутка.

Поскольку этот массив пуст, поиск возвращает пустой массив, и применяется третий размотчик. Непосредственно перед этапом $group конвейер содержит 2 документа с массивами:

[
  {
    _id: "ObjectId",
    data: "other data"
    reviews: {content:"review1", author:"ObjectId"},
    followers: {author: []},
    watchers: {author: []}
  },
{
    _id: "ObjectId",
    data: "other data"
    reviews: {content:"review2", author:"ObjectId"},
    followers: {author:[]},
    watchers: {author: []}
  }
]

Поскольку оба документа имеют одинаковый _id, они сгруппированы вместе, и в конечном результате первый документ содержит " data ".

Для массивов, когда встречается каждый документ, значение соответствующего поля помещается в массив, в результате чего каждый массив имеет 2 значения.

...