MongoDB $match в совокупном поиске не работает должным образом

Когда я запускаю этот запрос:

db.friendRequests.aggregate([
        $lookup: {
          from: "users",
          localField: "author",
          foreignField: "_id",
          pipeline: [
            {
              $match: {
                $expr: {
                  friend_id: new mongoose.Types.ObjectId(userid),
                },
              },
            },
          ],
          as: "userdata",
        }
])

Он возвращает каждую запись в коллекции, но в ней есть конвейер. Тогда почему он не работает?

Вы можете помочь мне? Спасибо!

Детская площадка: https://mongoplayground.net/p/Eh2j8lU4IQl

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
0
0
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для версии mongodb ниже 5.0 (спасибо за замечание @user20042973): $lookup с localField и foreignField будет игнорировать pipeline. Удалите их и добавьте ключ let, чтобы включить конвейер.

И как мне использовать ключ let?

Alms 22.11.2022 14:52

Я не думаю, что это правильно на 5.0 @nimrod serok, см. здесь

user20042973 22.11.2022 15:10
Ответ принят как подходящий

Поле friend_id присутствует в коллекции friendRequests (источник агрегации), а не в коллекции users, которая является целью для $lookup. Следовательно, этот предикат должен находиться на стадии $match, которая предшествует $lookup:

db.friendRequests.aggregate([
  {
    $match: {
      "friend_id": ObjectId("636a88de3e45346191cf4257")
    }
  },
  {
    $lookup: {
      from: "users",
      localField: "author",
      foreignField: "_id",
      as: "userdata"
    }
  }
])

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


Оригинальный ответ

Этот синтаксис неверен:

$match: { 
  $expr: {
    friend_id: new mongoose.Types.ObjectId(userid),
  },
}

Вы должны изменить его либо на

$match: { 
  friend_id: new mongoose.Types.ObjectId(userid),
}

Или

$match: { 
  $expr: {
    $eq: [ 
      "$friend_id", new mongoose.Types.ObjectId(userid)
    ]
  },
}

Ни один из них не работает

Alms 22.11.2022 15:19

Возвращает пустой userdata

Alms 22.11.2022 15:20

Не могли бы вы обновить свой вопрос с помощью (текстовых) образцов документов?

user20042973 22.11.2022 15:29

простите, с чем?

Alms 22.11.2022 15:31

Образцы документов, которые вы используете, в текстовом формате. Мы должны быть в состоянии воспроизвести проблему, чтобы помочь. Еще лучше, если бы вы могли просто поделиться примером mongoplayground.net, в который загружены ваши документы. Кроме того, каково значение userid в вашем коде и откуда оно берется? Я вообще не вижу других ссылок на него в вашем вопросе, поэтому, возможно, ничего не совпадает.

user20042973 22.11.2022 15:38

идентификатор пользователя поступает из внешнего интерфейса (углового) и работает. Даже если жестко закодировать идентификатор, он не работает

Alms 22.11.2022 15:41

Судя по скриншотам, документы в коллекции users не содержат поля friend_id, что будет еще одной причиной того, что агрегация работает не так, как вы хотите. Я хотел бы помочь в дальнейшем, но я не могу сделать это без образцов документов (в формате, который можно скопировать) или игровой площадки, где я могу воспроизвести проблему. Пожалуйста, сообщите нам, если вы отредактируете свой вопрос, чтобы включить эту информацию. Смотрите также, почему изображения бесполезны

user20042973 22.11.2022 15:47

хорошо, если я отправлю вам экспортированные коллекции?

Alms 22.11.2022 15:48

я создал ссылку на mongoplayground, если она полезна

Alms 22.11.2022 16:17

Большое спасибо! Можете ли вы также предоставить нам пример значения для userid?

user20042973 22.11.2022 16:21

Я обновил ссылку с жестко запрограммированным идентификатором пользователя

Alms 22.11.2022 16:22

когда он работает, он должен возвращать 2 запроса, потому что третий - исходящий запрос

Alms 22.11.2022 16:23

Ваши решения работают! Большое спасибо!

Alms 22.11.2022 17:30

Другие вопросы по теме