汇总数组

时间:2017-06-30 06:45:47

标签: php mongodb mongodb-query aggregation-framework

我只想通过php了解mongodb中的数量。在这种情况下,我的文档看起来像这样:

{
"_id": 1,
"item" : [
{ "name": "foo",
"price": 1000
},
{ "name": "bar",
"price": 500
}
]
}

{
"_id": 2,
"item" : [
{ "name": "foo",
"price": 1000
}
]
}

当我使用以下代码时:

$connection = new MongoClient();
$db = $connection->shop;
$collection = $db->sales;
$pipe = array(array('$unwind'=>'$item'),
array('$group'=>array('_id'=>array('_id'=>'1','result'=>array('$sum'=>'$item.price')))));
$total = $collection->aggregateCursor($pipe);
foreach ($total as $dc){
$total_price = $dc['result'];
}
echo "<b>Result of all this customer : </b>".$total_price."<br>";

该代码的结果看起来像所有文档的结果,如:

Result of all this customer : 2500

在我希望的另一方面,结果已计入每个id不计算我所拥有的所有文件。该代码有什么问题?

我希望,这个案子的结果是:

Result of all this customer : 1500

请有人帮助我......

我发现以下答案,也许它会帮助那些遇到同样麻烦的人。

$connection = new MongoClient();
    $db = $connection->shop;
    $collection = $db->sales;
    $pipe = array(array('$unwind'=>'$item'),array('$match'=>array('_id'=>'1')), array('$group'=>array('_id'=>array('_id'=>'1','result'=>array('$sum'=>'$item.price')))));
    $total = $collection->aggregateCursor($pipe);
    foreach ($total as $dc){
    $total_price = $dc['result'];
    }
    echo "<b>Result of all this customer : </b>".$total_price."<br>";

添加了$ match以对ID进行排序,该查询将仅检查具有目标ID的嵌入式文档。

2 个答案:

答案 0 :(得分:0)

这里只需要一个$group管道阶段,因为您实际上可以对数组项使用$sum,为分组使用“累加器”:

$result = $collection->aggregate([
  [ '$group' => [ 
    '_id' => null,
    'total_price' => [ '$sum' => [ '$sum' => '$item.price' ] ] 
  ]]
])

这比使用$unwind更有效率,当你实际上不需要它时应该避免使用它。

使用$unwind的旧方式实际指向该字段:

$result = $collection->aggregate([
  [ '$unwind' => '$item' ],
  [ '$group' => [ 
    '_id' => null,
    'total_price' => [ '$sum' => '$item.price' ]
  ]]
])

答案 1 :(得分:0)

这是聚合。如果您删除匹配阶段,它将为每个用户提供一笔金额。

> db.product.aggregate(
...    [
...       {
...          $match: {'_id':{ '$eq': 1}}
...       },
...       {
...           $unwind: '$item'
...       },
...       {
...         $group : {
...            _id : '$_id',
...            totalPrice: { $sum: '$item.price' },
...         }
...       }
...    ]
... )
{ "_id" : 1, "totalPrice" : 1500 }