当前位置: 首页 > 知识库问答 >
问题:

Mongoose将聚合到嵌套的doc Get count中,并将新值附加到查询结果中

慕容典
2023-03-14

我有这个用户和帖子集合,其中包含嵌入式文档评论回复

{
 _id:34
 name:"dimer"
}
  1. 职位
{
 _id:"1234",
 body:" hello ! I love mongodb, but its hard",
 likes:["34"],
 comments:{
    _id:"3453",
    body:"me I don't like mongodb i like sql "
    likes:["34"],
    replies:{
       _id:"2345",
       body:"both of them are great"
       likes:["34"],
    }
  }
}

问题是,我想聚合到帖子中,得到所有的帖子,之后我想给帖子、评论、回复添加新的键值,女巫会指定用户是否喜欢这个帖子,例如:喜欢: true注意:我已经准备好了经过身份验证的用户ID。我想检查用户ID是否存在于每个子树的喜欢文档中(帖子,评论,回复)

更具体地说,这是我预期的结果:

{
 _id:"1234",
 body:" hello ! I love mongodb, but its hard",
 liked:true,
 likesCount:1
 comments:{
     _id:"3453",
     body:"me I don't like mongodb i like sql "
     liked:true,
     likesCount:1
     replies:{
       _id:"2345",
       body:"both of them are great"
       liked:true,
       likesCount:1
    }
  }
}

注意:如果您可以帮助查询最多的评论,对我来说没问题:预期结果:

{
 _id:"1234",
 body:" hello ! I love mongodb, but its hard",
 liked:true,
 likesCount:1
 comments:{
     _id:"3453",
     body:"me I don't like mongodb i like sql "
     liked:true,
     likesCount:1
  }
}

这就是我尝试的,根本不起作用:

const result = await PostModel.aggregate([
      {
        $project: {
          likesCount: { $size: "$likes" },
          commentsCount: { $size: "$comments" },
          liked: { $in: [ID(uid), "$likes"] },
          likes: 1,
          comments:{
             likesCount: { $size: "$likes" },
             liked: { $in: [ID(uid), "$likes"] },
            ......
         } 
     }
}

...注意:我想使用$group和$unWind找到一个更干净的解决方案我的假解决方案


共有1个答案

颜实
2023-03-14

根据你的第一个预期结果这是一个解决方案

const result = await PostModel.aggregate([
{
      $project: {
          _id: 1,
          body: 1,
          liked: { $in: [ID(uid), "$likes"] },
          likesCount: { $size: "$likes" },
          comments: {
                _id: 1,
                body:1,
                liked: { $in: [ID(uid), "$comment.likes"] },
                likesCount: { $size: "$comment.location.likes" },
               
      }
}]);

通过这个查询,您将得到如下响应-

{
"_id" : "1234",
"body" : " hello ! I love mongodb, but its hard",
"liked" : true,
"likesCount" : 1
"comments" : {
    "_id" : 3453",
    "body" : "me I don't like mongodb i like sql ",
    "liked" : true,
    "likesCount" : 1
    "replies" : {
        "_id" : "2345",
        "body" : "both of them are great",
        "liked" : true,
        "likesCount" : 1
    },
}}

如果你想要第二个预期结果,那么这是一个解决方案-

const result = await PostModel.aggregate([
{
      $project: {
          _id: 1,
          body: 1,
          liked: { $in: [ID(uid), "$likes"] },
          likesCount: { $size: "$likes" },
          comments: {
                _id: 1,
                body:1,
                liked: { $in: [ID(uid), "$likes"] },
                likesCount: { $size: "$likes" },
              }
      }
}])

以及由此产生的预期结果-

{
"_id" : "1234",
"body" : " hello ! I love mongodb, but its hard",
"liked" : true,
"likesCount" : 1
"comments" : {
    "_id" : "3453",
    "body" : "me I don't like mongodb i like sql ",
    "liked" : true,
    "likesCount" : 1
}}
 类似资料:
  • 问题内容: 我是node(express)和pg-promise的新手,还无法弄清楚如何将每个嵌套查询(loop)的结果添加到主json数组结果查询中。 我有两个表:帖子和评论。 因此,我想将每个评论的结果添加到每个帖子中并返回帖子。我有这个,但是不起作用: 答案: 选项1(最佳选择) : 通过JSON到psql进行单个查询( JSON查询 ) 参见@ vitaly-t的回答 要么 使用ajax异

  • 问题内容: CREATE TABLE logistics ( id int primary key, campaign VARCHAR(255), event_type VARCHAR (255), date_offered VARCHAR (255), date_ordered DATE, date_delivered DATE, date_recorded DATE, date_complet

  • 我有一个数据库,里面有澳大利亚800家不同的酒吧、俱乐部和餐馆。 我想为我的网站建立一个链接列表,统计不同郊区和主要类别的不同场馆的数量。 像这样: 餐厅,伯恩山(15家) 餐厅,道斯角(6家) 俱乐部,悉尼(138家) 我可以通过首先获得所有场馆来艰难地完成这项任务。然后运行一个场地。distinct('details.location.Suburban')获得所有独特的郊区。 从这里,我可以运

  • 问题内容: 我正在用SSRS编写一份报告。该数据集填充有MS SQL Server的SQL查询。它使用Union All查询几个相似的表。问题是有一些信息丢失。不同的表适用于不同的工作站点,但是这些表中的任何列都没有站点名称。标识站点的唯一方法是通过表名。在“全部合并”的结果的合并列中,无法分辨出哪些行来自哪个站点。 有没有一种方法可以更改我的查询以在结果中添加一列,该列将具有与每一行相关联的工作

  • 我试图查询与特定用户至少有一种共同颜色的所有用户,我已经能够做到这一点,但是我无法弄清楚如何我的结果,以便我可以得到一个用户以及他们共有的颜色。 我的示例用户文档的一部分如下: 这是我的查询,用于获取与另一个具有红色、橙色和绿色的用户相同的颜色: 如何使用共同的颜色聚合用户?