Mongoose 聚合获取计数并将新值附加到查询结果

Posted

技术标签:

【中文标题】Mongoose 聚合获取计数并将新值附加到查询结果【英文标题】:Mongoose aggregate Get count and append new value to the query result 【发布时间】: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" 
        
     
 
]

【问题讨论】:

【参考方案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)

以上是关于Mongoose 聚合获取计数并将新值附加到查询结果的主要内容,如果未能解决你的问题,请参考以下文章

具有 3 个级别的 MongoDB 嵌套查找并将新值附加到结果文档

如何获取 Model.countDocuments() 函数返回的文档计数并将其设置为猫鼬中的其他字段

按月对记录进行分组并计数 - Mongoose、nodeJs、mongoDb

Mongoose 返回匹配查询的所有文档的计数

Mongoose 使用异步迭代器流式传输聚合查询

子文档中行的 Mongoose 聚合“$sum”