【问题标题】:MongoDB nested object aggregation sum and sortMongoDB 嵌套对象聚合求和和排序
【发布时间】:2017-06-25 21:37:36
【问题描述】:

我有高度嵌套的 mongodb 对象集,我想根据他们的投票结果对子文档进行排序,例如:

{
   "_id":17846384es,
   "company_name":"company1",
   "products":[
       {
         "product_id":"123785",
         "product_name":"product1",
         "user_votes":[
              {
                 "user_id":1,
                  "vote":1
              },
              {
                 "user_id":2,
                  "vote":2
              }
          ]
       },
       {
         "product_id":"98765",
         "product_name":"product2",
         "user_votes":[
              {
                 "user_id":5,
                  "vote":3
              },
              {
                 "user_id":3,
                  "vote":3
              }
          ]
       }
    ]
}  

我想根据他们投票的结果排序为降序产品 预期的输出是

{
   "_id":17846384es,
   "company_name":"company1",
   "products":[
       {
         "product_id":"98765",
         "product_name":"product2",
         "user_votes":[
              {
                 "user_id":5,
                  "vote":3
              },
              {
                 "user_id":3,
                  "vote":3
              }
          ]
        "votes":8
       },
       {
         "product_id":"123785",
         "product_name":"product1",
         "user_votes":[
              {
                 "user_id":1,
                  "vote":1
              },
              {
                 "user_id":2,
                  "vote":2
              }
          ],
          "votes":3
       }
    ]
}  

有什么想法吗?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    以下管道

    db.products.aggregate([
        { $unwind: "$products" },
        {
            $project: {
                company_name: 1,
                products: 1,
                totalVotes: {
                    $sum: "$products.user_votes.vote"
                }
            }
        },
        { $sort: { totalVotes: -1 } },
        {
            $group: {
                _id: "$_id",
                company_name: { $first: "$company_name" },
                products: { $push: "$products" }
            }
        }
    ])  
    

    会输出

    {
        "_id" : "17846384es",
        "company_name" : "company1",
        "products" : [ 
            {
                "product_id" : "98765",
                "product_name" : "product2",
                "user_votes" : [ 
                    {
                        "user_id" : 5,
                        "vote" : 3
                    }, 
                    {
                        "user_id" : 3,
                        "vote" : 3
                    }
                ]
            }, 
            {
                "product_id" : "123785",
                "product_name" : "product1",
                "user_votes" : [ 
                    {
                        "user_id" : 1,
                        "vote" : 1
                    }, 
                    {
                        "user_id" : 2,
                        "vote" : 2
                    }
                ]
            }
        ]
    }
    

    如果您想保持产品级别的投票总和如预期输出所示,只需修改$project 阶段,如下所示

    ...
    {
        $project: {
            company_name: 1,
            products: {
                product_id: 1,
                product_name: 1,
                user_votes: 1,
                votes: { $sum: "$products.user_votes.vote" }
            }
        }
    }
    ...
    

    【讨论】:

    • 我可以在一个结果中得到这个结果和公司信息吗??
    • 请显示您的预期输出以避免任何误解
    • 请注意,$project 阶段中的 $sum 仅在 MongoDB 3.2 及更高版本中可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2015-03-10
    • 1970-01-01
    • 2021-04-19
    • 2021-02-13
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多