【问题标题】:Mongoose aggregate into a nested doc Get count and append new value to the query resultMongoose 聚合到嵌套文档中获取计数并将新值附加到查询结果中
【发布时间】:2021-08-04 15:18:06
【问题描述】:

我有这个用户和帖子集合以及嵌入式文档comments 和replies:

  1. 用户
{
 _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"],
    }
  }
}

问题是,我想聚合到帖子中并获取所有帖子,然后我想将新的键值附加到帖子、cmets、回复中,女巫会指定用户是否喜欢帖子:liked:true 注意:我已经准备好经过身份验证的用户 ID。我想检查每个子树(帖子、cmets、回复)上的likes 文档中是否存在用户 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
    }
  }
}

注意:如果您可以帮助查询 cmets,对我来说没问题: 预期结果:

{
 _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 来找到一个更清洁的解决方案 我的假solution

【问题讨论】:

    标签: javascript arrays reactjs mongodb mongoose


    【解决方案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), "$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
    }}
    

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 2021-07-21
      • 1970-01-01
      • 2021-08-06
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 2020-03-29
      相关资源
      最近更新 更多