我是mongoDB和php的第一步,试图找出聚合的工作原理。我对如何从命令行使用它们有一个大概的想法,但我试图为PHP驱动程序翻译它。我正在使用餐馆dexample 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"
}
我只想算一下有多少餐馆的位置,我正在做的是
$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->myNewDb->restaurants;
$results = $collection->aggregate(
[
'name' => '$name'
],
[
'$group' => [
'cuisine' => ['sum' => '$sum']
]
]
);
我收到此错误
Fatal error: Uncaught exception 'MongoDB\Exception\InvalidArgumentException'
with message '$pipeline is not a list (unexpected index: "name")'
任何想法?我无法在php.net上找到任何好的文档。
感谢 中号
答案 0 :(得分:0)
只需查看documentation,您就会看到管道必须作为数组传递。
aggregate
方法接受两个参数$pipelines
和$options
(public 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
值收集到数组中。