【问题标题】:Mongoose aggregate Get count and append new value to the query resultMongoose 聚合获取计数并将新值附加到查询结果
【发布时间】:2021-08-01 15:23:05
【问题描述】:

鉴于我有这两个系列:。

1st.col

users:
{
  _id :34,
 name :"mama mia"   
}

2nd.col

posts:
{
  _id :67
 body :" hello mongoose"
 likes:[ 0: ObjectId("34") ]

}

我想让每一个帖子都有点赞数。 假设我有一个 auth 用户 id 准备好并且想要通过喜欢进行映射,并且如果在帖子中找到 user._id(auth id) 喜欢我想在集合结果中附加一个新属性而不是在 db 中,我只是想修改我要得到的结果。

为了回答我的问题,这是预期的结果:

[
 {
      _id  : 67
     body  : " hello mongoose"
     likesCount : 1
     liked :true
     likes :{
       "34":{
            name :"mama mia" 
        }
     }
 }
]

【问题讨论】:

    标签: javascript reactjs mongodb mongoose mongodb-query


    【解决方案1】:
    • $lookup加入用户收藏
    • $map循环likes数组并返回key-value格式结果
    • $arrayToObject 将对象的键值数组转换为对象
    • $size 获取 likes 数组中的总元素
    • $in 检查 likes 数组中的当前身份验证用户 ID 与否
    let auth_user_id = ObjectId("34");
    db.posts.aggregate([
      {
        $lookup: {
          from: "users",
          localField: "likes",
          foreignField: "_id",
          as: "likes"
        }
      },
      {
        $project: {
          likes: {
            $arrayToObject: {
              $map: {
                input: "$likes",
                in: {
                  k: { $toString: "$$this._id" },
                  v: "$$this.name"
                }
              }
            }
          },
          likesCount: { $size: "$likes" },
          liked: { $in: [auth_user_id, "$likes"] },
          body: 1
        }
      }
    ])
    

    Playground

    【讨论】:

    • 嗨哥们,我觉得加入用户收藏没有任何目的,对吧!!
    • 是的,他提到了我已经准备好验证用户ID。
    • @varman wt 你的意思是,我怎么知道用户是否喜欢这篇文章?
    • @DimerBwimba 它与您之前的问题完全不同,您可以提出新问题而不是更新当前问题。看看如何ask good question。
    • 确保您已将输入 auth_user_id 转换为 objectid 类型,使用 mongoose.Types.ObjectId(auth_user_id)
    猜你喜欢
    • 2021-08-04
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多