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>";
idをソートするための$ matchを追加しました。このクエリは、ターゲットIDを持つ埋め込みドキュメントのみをチェックします。
単純に1つのパイプラインステージ。最新のPHPを使用して、[[''グループ=> ['_id' => NULL、 'total_price' => ['$ sum' => ['$ sum' => '$ item.price']]]]] 'ここでは 'array()'の代わりに '[]'を使っています。 –
なぜあなたは$ unwindを取って$ groupに直接行っていないのですか? @NeilLunn – Unknown
あなたがそれを必要とせず、物事を遅くするので、かなり。最新のMongoDBリリースでは '$ sum'を配列の引数とともに適用できます。 '' $ item.price''は、 '' price''フィールド値の "only"の配列を返します。その配列の合計を得るには$ sumに渡します。そして、 '$ sum'が再び使われます実際の '$ group'ステートメントのために" accumulate "します。したがって '$ sum'の二重使用。私は他のところでこの質問に答えてきたことを知っているので、私はそれを探しています。 –