MongoDB嵌套对象聚合和排序

MongoDB嵌套对象聚合和排序,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一组高度嵌套的mongodb对象,我想根据投票总数对子文档进行排序,例如: { "_id":17846384es, "company_name":"company1", "products":[ { "product_id":"123785", "product_name":"product1", "user_votes":[ { "user_i

我有一组高度嵌套的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
       }
    ]
}  

有什么想法吗

以下管道

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及更高版本中可用。