如何在php中对mongodb文档进行分组

如何在php中对mongodb文档进行分组,php,mongodb,grouping,Php,Mongodb,Grouping,我使用MongoServer3.6和php作为后端语言。 此外,我正在使用最新的php mongo库与新更新的驱动程序对话 我收集了1000万条记录,如下所示: [ { "did": "123456", "did_usage": "1", "did_timestamp": "15012" }, { "did": "4567811", "did_usage": "1", "did_timestamp": "15013" }, {

我使用MongoServer3.6和php作为后端语言。 此外,我正在使用最新的php mongo库与新更新的驱动程序对话

我收集了1000万条记录,如下所示:

[
  {
    "did": "123456",
    "did_usage": "1",
    "did_timestamp": "15012"
  },
  {
    "did": "4567811",
    "did_usage": "1",
    "did_timestamp": "15013"
  },
  {
    "did": "46465464",
    "did_usage": "2",
    "did_timestamp": "15014"
  },
  {
    "did": "7894446",
    "did_usage": "2",
    "did_timestamp": "15015"
  },
  {
    "did": "65646131",
    "did_usage": "3",
    "did_timestamp": "15016"
  },
  {
    "did": "7989464",
    "did_usage": "2",
    "did_timestamp": "15017"
  },
  {
    "did": "651651664",
    "did_usage": "1",
    "did_timestamp": "15018"
  }.......
]
现在,我想找到一个唯一的文档,它具有最少的did使用和最少的did时间戳

到目前为止,我已通过以下方式找到了唯一的文档:

$sample = array('$sample' => array('size' => 1));
$pipeline = array($match, $group, $project, $sample);
$cursor = $collection->aggregate($pipeline);
我需要有关
$group
的帮助。 我试过这个

$group = array('$group' => array('_id' => '$did_usage', 'did_usage_timestamp' => array('$min' => '$did_usage_timestamp')));

但这并没有像预期的那样起作用。

即使不知道原始代码中的
$match
$project
在做什么,我们也可以假设
$group
正在收集数据的一个子集上运行,因为在管道中它前面只有
$match
。仅基于示例收集数据和
$group
阶段,很明显与
$min
运算符一起使用的
$dig\u usage\u timestamp
引用了进入
$group
阶段的文档中不存在的字段

在本地测试时,随机选择的输出文档中的
did\u usage\u timestamp
null

<?php

require 'vendor/autoload.php';

$client = new MongoDB\Client;
$collection = $client->test->foo;

$collection->drop();
$collection->insertMany([
    ["did" => "123456", "did_usage" => "1", "did_timestamp" => "15012"],
    ["did" => "4567811", "did_usage" => "1", "did_timestamp" => "15013"],
    ["did" => "46465464", "did_usage" => "2", "did_timestamp" => "15014"],
    ["did" => "7894446", "did_usage" => "2", "did_timestamp" => "15015"],
    ["did" => "65646131", "did_usage" => "3", "did_timestamp" => "15016"],
    ["did" => "7989464", "did_usage" => "2", "did_timestamp" => "15017"],
]);

$cursor = $collection->aggregate([
    ['$group' => ['_id' => '$did_usage', 'did_timestamp' => ['$min' => '$did_usage_timestamp']]],
    ['$sample' => ['size' => 1]],
]);

var_dump($cursor->toArray());
$min
操作员的字段路径更改为
$did\u timestamp
可以解决此问题。

主持人注意:请不要破坏您的帖子。一旦你发布了一个问题,它们就属于网站及其用户。即使它对你不再有用,它也可能对将来的某个人有所帮助。回答者也会努力写下他们的答案,如果你从帖子中删除了内容,这将不再有用。另外,请注意,通过在Stack Exchange网络上发布,您已授予SE分发该内容的不可撤销权利(根据CC by-SA 3.0许可证)。根据SE政策,任何故意破坏行为都将恢复原状。
array(1) {
  [0]=>
  object(MongoDB\Model\BSONDocument)#14 (1) {
    ["storage":"ArrayObject":private]=>
    array(2) {
      ["_id"]=>
      string(1) "1"
      ["did_timestamp"]=>
      NULL
    }
  }
}