Агрегированный поиск Mongodb по _id не работает

#mongodb #aggregate #lookup

#mongodb #агрегат #поиск

Вопрос:

Агрегированный поиск MongoDB не дает результата, пока foreignField как _id . У меня есть две коллекции, users и discussions

Пример users данных:

 [{
    _id: 5f9c50dcfac1f091400225e3,
    email: 'Peter.Parker@gmail.com',
    details: { fname: 'Peter Test', lname: 'Fulton' },
},
{
    _id: 5fa432bfb91fab7db60c70eb,
    email: 'Spidy@xxx.com',
    details: { fname: 'Frodo', lname: 'Baggins' },
},
{
    _id: 5fa8ec7d3ce22610e5d15190,
    email: 'tommy@xxx.com',
    details: { fname: 'Tommy', lname: 'test' },
},
{
    _id: 5fc38bb0b3683651be970180,
    email: 'jerry@xxx.io',
},
{
    _id: 5fd2340cc443d155ab38383b,
    email: 'Dexter@xxx.io',
    details: { fname: 'Dexter', lname: 'Lab' },
}]
 

Пример discussions данных:

  {_id: ObjectId("5fb2abd6b14fa5683979df58"),
  tags: [ 'javascritp', 'css', 'html' ],
  title: 'Why is this inline-block element pushed downward?',
  post: 'Test Post',
  learnerId: ObjectId("5f9c50dcfac1f091400225e3"),
 }
 

Здесь « _id of users » связано с « learnerId of « discussions .

Мой агрегированный запрос выглядит так, как показано ниже.

 db.users.aggregate([
            { $project: { "details.fname": 1, "details.lname":1,email:1, _id:1}},
            {$lookup: {
                from: "discussions",
                localField: "learnerId",
                foreignField: "_id",
                as: "discussions"
            }}
        ])
 

Здесь 'Peter Test' с _id 5f9c50dcfac1f091400225e3 связан с. discussions LeanerId Но я ожидал, что обсуждения будут заполнены в моем результате. Я вижу пустой массив обсуждений во всех коллекциях пользователей.

  [{
    _id: 5f9c50dcfac1f091400225e3,
    email: 'Peter.Parker@gmail.com',
    details: { fname: 'Peter Test', lname: 'Fulton' },
    discussions: []
},
{
    _id: 5fa432bfb91fab7db60c70eb,
    email: 'Spidy@xxx.com',
    details: { fname: 'Frodo', lname: 'Baggins' },
    discussions: []
},
{
    _id: 5fa8ec7d3ce22610e5d15190,
    email: 'tommy@xxx.com',
    details: { fname: 'Tommy', lname: 'test' },
    discussions: []
},
{
    _id: 5fc38bb0b3683651be970180,
    email: 'jerry@xxx.io',
    discussions: []
},
{
    _id: 5fd2340cc443d155ab38383b,
    email: 'Dexter@xxx.io',
    details: { fname: 'Dexter', lname: 'Lab' },
    discussions: []
}]
 

Можете ли вы указать, что не так в моем агрегированном запросе здесь?

Комментарии:

1. У вас разные типы идентификаторов, возможно, в результате они не совпадают.

2. У вас не совпадают идентификаторы.. Работает игровая площадка mongo mongoplayground.net/p/YDSJl1VU62S

3. Спасибо вам за ваш ответ. Я неправильно понял. Спасибо за разъяснения.

Ответ №1:

Вы не сопоставили localField и foreignField

 db.users.aggregate([
  {
    $project: {
      "details.fname": 1,
      "details.lname": 1,
      email: 1,
      _id: 1
    }
  },
  {
    $lookup: {
      from: "discussions",
      localField: "_id",
      foreignField: "learnerId",
      as: "discussions"
    }
  }
])
 

Работает игровая площадка Mongo