我只想通过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的嵌入式文档。
答案 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 }