2014-10-18 101 views
0

我已经开始玩MongoDB和聚合框架。我试图计算的是费用总额(333)和生存总价值(777)。任何想法如何做到这一点?我一直在玩$ unwind,$ group,$项目,但没有得到任何好处。MongoDB和聚合函数

{ 
"_id" : ObjectId("5442a4afc25282ab96463126"), 
"expenses" : [ 
    { 
     "name" : "a", 
     "expenseValue" : 111 
    }, 
    { 
     "name" : "b", 
     "expenseValue" : 222 
    } 
], 
"subsistence" : [ 
    { 
     "name" : "a", 
     "valueSubsistence" : 333 
    }, 
    { 
     "name" : "b", 
     "subsistenceValue" : 444 
    } 
] 

}

我得到了工作,但不得不解雇两个查询。一个放松的费用,另外一个放松生活

db.test.aggregate([{$unwind:"$expenses"},{$group:{_id:null,totalExpenses:{$sum:"$expenses.expenseValue"}}}]) 
{ 
"result" : [ 
    { 
     "_id" : null, 
     "totalExpenses" : 333 
    } 
], 
"ok" : 1 

}

> db.test.aggregate([{$unwind:"$subsistence"},{$group:{_id:null,totalSubsistence:{$sum:"$subsistence.subsistenceValue"}}}]) 
{ 
"result" : [ 
    { 
     "_id" : null, 
     "totalSubsistence" : 777 
    } 
], 
"ok" : 1 

}

的事情是我希望得到的是在一个查询完成。当我放松一气呵成两个数组我越来越下方,并从那里我得到无处到目前为止

db.test.aggregate([{$unwind:"$expenses"},{$unwind:"$subsistence"}]) 
{ 
"result" : [ 
    { 
     "_id" : ObjectId("5442a4afc25282ab96463126"), 
     "expenses" : { 
      "name" : "a", 
      "valueExpenses" : 111 
     }, 
     "subsistence" : { 
      "name" : "a", 
      "valueSubsistence" : 555 
     } 
    }, 
    { 
     "_id" : ObjectId("5442a4afc25282ab96463126"), 
     "expenses" : { 
      "name" : "a", 
      "valueExpenses" : 111 
     }, 
     "subsistence" : { 
      "name" : "b", 
      "valueSubsistence" : 444 
     } 
    }, 
    { 
     "_id" : ObjectId("5442a4afc25282ab96463126"), 
     "expenses" : { 
      "name" : "b", 
      "valueExpenses" : 111 
     }, 
     "subsistence" : { 
      "name" : "a", 
      "valueSubsistence" : 333 
     } 
    }, 
    { 
     "_id" : ObjectId("5442a4afc25282ab96463126"), 
     "expenses" : { 
      "name" : "b", 
      "valueExpenses" : 222 
     }, 
     "subsistence" : { 
      "name" : "b", 
      "valueSubsistence" : 444 
     } 
    } 
], 
"ok" : 1 
} 

回答

1

你的风格valueSubsistencesubsistenceValue之间你的例子混淆你的字段名,但假设那些只是拼写错误而且它们实际上是一致的,你非常接近。诀窍是做两个独立的$group阶段,在这两个阶段中使用$first将第一个$group的结果转入第二个阶段。

因此,像这样:

db.test.aggregate([ 
    {$unwind: "$expenses"}, 
    {$group:{ 
     _id:null, 
     totalExpenses: {$sum: "$expenses.expenseValue"}, 
     subsistence: {$first: '$subsistence'} 
    }}, 
    {$unwind: "$subsistence"}, 
    {$group:{ 
     _id:null, 
     totalExpenses: {$first: '$totalExpenses'}, 
     totalSubsistence: {$sum: "$subsistence.subsistenceValue"} 
    }}, 
]) 

其中给出的输出:

{ 
    "result" : [ 
     { 
      "_id" : null, 
      "totalExpenses" : 333, 
      "totalSubsistence" : 777 
     } 
    ], 
    "ok" : 1 
}