2017-08-29 9 views
0

私はmongoDBとphpの最初のステップで、集計の仕組みを理解しようとしています。私はコマンドラインからそれらを使用する方法に関するおおよそのアイデアを持っていますが、私はPHPのドライバのためにこれを翻訳しようとしています。私は私がやっていることはPHP MongoDBのドライバと集約

$client = new MongoDB\Client("mongodb://localhost:27017"); 
$collection = $client->myNewDb->restaurants; 
$results = $collection->aggregate(['name' => '$name'],['$group' => ['cuisine' => ['sum' => '$sum']]]); 

で、レストランはDB、私はちょうど場所のためにどのように多くのレストランをカウントするこの

{ 
"_id" : ObjectId("59a5211e107765480896f3f8"), 
"address" : { 
    "building" : "284", 
    "coord" : [ 
     -73.9829239, 
     40.6580753 
    ], 
    "street" : "Prospect Park West", 
    "zipcode" : "11215" 
}, 
"borough" : "Brooklyn", 
"cuisine" : "American", 
"grades" : [ 
    { 
     "date" : ISODate("2014-11-19T00:00:00Z"), 
     "grade" : "A", 
     "score" : 11 
    }, 
    { 
     "date" : ISODate("2013-11-14T00:00:00Z"), 
     "grade" : "A", 
     "score" : 2 
    }, 
    { 
     "date" : ISODate("2012-12-05T00:00:00Z"), 
     "grade" : "A", 
     "score" : 13 
    }, 
    { 
     "date" : ISODate("2012-05-17T00:00:00Z"), 
     "grade" : "A", 
     "score" : 11 
    } 
], 
"name" : "The Movable Feast", 
"restaurant_id" : "40361606" 

}

のようなレコードのリストをdexample使用していますし、このエラーが発生しています

Fatal error: Uncaught exception 'MongoDB\Exception\InvalidArgumentException' with message '$pipeline is not a list (unexpected index: "name")' 

ご意見はありますか?私はphp.net上の良いドキュメントを見つけることができません。パイプラインが配列として渡さなければならないことを、

おかげ M

+0

「翻訳する」とはどういう意味ですか?ちょうどすべての言語で、広く利用できるJavaScript Object Notationのサンプルと簡単にやり取りすることができます。基本的な前提はPHPを使って '{}'や '[]'を '[]'や 'array()'に置き換えることです。そのことを覚えておいても、構文に従うことには至りません。 '$ group'は' _id'を必要とします。 '['name' => '$ name']'はあなたが何をすると思われるか分かりません。おそらく、期待される成果が何であるべきかを述べるべきです。 –

答えて

0

ちょうどdocumentationに見てみると、次のように表示されます。

メソッドは、2つのパラメータ$pipelines$optionspublic function aggregate(array $pipeline, array $options = []))を受け入れます。

前述したように、$groupは、_idの要素を持つ必要があります。

特定の式で文書をグループ化し、次の文書に出力します。 各グループごとに文書を作成します。出力文書 には、キー別のグループを含む_idフィールドが含まれています。 出力ドキュメントには、$ groupの_idフィールドでグループ化されたアキュムレータ式の値 を保持する計算フィールドも含めることができます。 $ groupは出力ドキュメントを注文しません。

https://docs.mongodb.com/manual/reference/operator/aggregation/group/

だからあなたのコードは次のようになります。

$results = $collection->aggregate([ 
    [ 
     '$group' => [ 
      '_id' => '$cuisine', 
      'sum' => ['$sum' => 1], 
      'names' => ['$push' => '$name'] 
     ] 
    ] 
]); 

このコードグループ文書cuisine要素によって、アイテムをカウントし、配列にすべてname値を収集。

+0

@ user3174311ようこそ。申し訳ありませんが(前にあった)よく答えませんが、私はMongoDBについても新しいです。 – Neodan