MongoDB嵌套对象聚合求和和排序

时间:2016-08-21 05:31:32

标签: mongodb mongodb-query aggregation-framework

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

任何想法?

1 个答案:

答案 0 :(得分:2)

以下管道

private static double doyourstuff(double d1,double d2,double d3)
{  
  write your entire logic here as above written in main method.
  return calculated_balance;
}


 public static void main(String[]args)
  {
     --read values via scanner as you read above.
    double S= doyourstuff(d1,d2,d3);
    System.out.println("Your balance in that time span is " + S + ".");-- your final call
  }

会输出

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