Mongoose Aggregate - поиск по условию (либо user1, либо user2) - PullRequest
0 голосов
/ 25 февраля 2019

Я пишу функцию агрегирования БД для получения ChatHeads для пользователя из Messages таблицы.

Ниже приведен объект сообщения из Messages Таблица

{
  "_id": "5c6e54c194509100146ea6da",
  "chat_id": "5bc81391767ba50013bc251c5bc58ac0ff45070013383422",
  "user1": "5bc58ac0ff45070013383422",
  "user2": "5bc81391767ba50013bc251c",
  "messageFrom": "5bc58ac0ff45070013383422",
  "dateTime": "2019-02-21T07:35:29.653Z",
  "message": "Hello ",
}

В зависимости от пользователя, который делает запрос, глава чата должна заполнить идентификатор другого пользователя, чтобы отобразить его имя / изображение в голове чата.

Я использую Агрегат, чтобы получить заголовки чата, но условное заполнениеУ меня проблема с другим пользователем. Ниже приведен мой текущий запрос, где req.user._id - это идентификатор запрашивающего пользователя.

chat.aggregate(

{
  $match: {
      $or: [ { user1:req.user._id }, { user2:req.user._id } ]
  }
},
{
  $group:{
      _id: '$chat_id',
      entry: { $first: "$$ROOT" },

  }
}

В моем понимании $lookup с условием может помочь, гдеlocalField должно измениться на entry.user1 или entry.user2 в зависимости от их значения.

Ниже приводится совокупная часть

$lookup: {
               from: "users",
               localField: < "entry.user1" or "entry.user2" depending upon condition> ,
               foreignField: "_id",
               as: "other_user"
            }

Мои требования

localField следуетскажем entry.user1 если entry.user1==req.user._id

localField должны сказать entry.user2 если entry.user2==req.user._id

1 Ответ

0 голосов
/ 26 февраля 2019

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

db.messages.aggregate([
    { $match: { $or: [ { user1:req.user._id }, { user2:req.user._id } ] } },
    { $addFields: { otherUser: { $cond: [ { $eq: [ "$user1", req.user._id ] }, "$user2", "user1" ] } } },
    { $lookup: { from: "users", localField: "otherUser", foreignField: "_id", as: "otherUserDetails" } }
])

По существу, прежде чем запустить $ lookup , вы можете использовать $ addFields с $ cond , чтобы определить, какой идентификатор пользователя должен использоваться для поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...