Добавить поле, если существует другой документ, соответствующий MongoDB и Mongoose - PullRequest
1 голос
/ 05 августа 2020

У меня есть коллекция сообщений с базовыми c информацией, например:

Posts = {
   _id: '',
   title '',
   desc '',
...
}

У меня также есть коллекция лайков вроде (document создаются или удаляются пользователем, как сообщение):

Likes = {
_id: '',
user_id: '',
post_id: '',
}

, и цель будет заключаться в том, чтобы, когда я получу список сообщений , добавить поле Понравилось кто показывает истину / ложь, если документ лайк совпадает или нет, а также количество совпадений в коллекции лайк (это я знаю как), например:

Posts = [{
   _id: '',
   title '',
   desc '',
   liked: true,
   likes: 5,
...
}, ...]

Я использовал $lookup и $addFields, но пока могу присоединиться только с одним значением. В моем случае я хочу один специфицированный c документ и отфильтрованный по 2 полям (user_id, post_id).

То, что я получил до сих пор:

    const posts = await posts.aggregate
    ([
      {
        $lookup: {
          from: 'likes',
          localField: '_id',
          foreignField: 'post_id',
          as: 'likes'
        }
      },
      { $match: {
        user_id: mongoose.Types.ObjectId(req.params.id),
      } },
      {
        $addFields: {
          likes: 
            { $size: "$likes" } // here nb of likes
        }
      }
    ])

1 Ответ

2 голосов
/ 05 августа 2020

Попробуйте с этим

db.getCollection('post').aggregate([
  {
    $lookup: {
      from: 'likes',
      localField: '_id',
      foreignField: 'post_id',
      as: 'likes'
    }
  },
  {
      $addFields:{
          size:{$size:"$likes"},
          liked: 
          {$size: {
                        $filter: {
                            input: "$likes",
                            as: "item",
                            cond: { $eq: [ "$$item.user_id", ObjectId("5f2a38ad61a591cf96d58f6a") ] }
                        }
                }
             }
          }
  },
  {
  $addFields:{
      liked:{
          $cond:[{$eq:["$liked",0]},false,true]
          }
      }    
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...