【问题标题】:PHP Mongo Aggregate exception: pipeline element 0 is not an objectPHP Mongo 聚合异常:管道元素 0 不是对象
【发布时间】:2016-11-03 14:38:28
【问题描述】:

我正在尝试获取具有相同电子邮件地址的用户数量。

我已经关注了MongoCollection Aggregate 的 php 文档。我还将我的查询与 stackoverflow 上的其他查询进行了比较。据我所知,我的管道与示例中的管道匹配。然而我得到了错误:

exception: pipeline element 0 is not an object

我认为是 $group 元素,它是一个对象(一旦转换为 mongo 使用的 json 格式,不是吗?

$pipeline = array(
  array(
    '$group' => array(
      '_id' => array( 'email' => '$email' ),
      'uniqueIds' => array( '$addToSet' => '$_id'  ),
      'count' => array( '$sum' => 1 )
    )
  ),
  array(
    '$match' => array(
      'count' => array( '$gt' => 1 )
    )
  )
);

$options = array(
  'allowDiskUse' => true
);

$results = $mongo->users_collection->aggregate( $pipeline, $options );

我做错了什么?我什至尝试从 php.net 运行查询,我当然希望没有结果,但它导致了同样的错误!?

EDIT 原来是我allowDiskUse,但如果我从函数中删除$options,我会收到一个错误,告诉我要使用它。

谢谢

【问题讨论】:

  • 你在这一行有错别字'_id' => array( 'email' => '$email', ), 只需去掉第一个逗号出现(,) 并重写代码以显示'_id' => array( 'email' => '$email' ),
  • 谢谢,虽然没有解决问题:(

标签: php mongodb mongodb-query aggregation-framework


【解决方案1】:

我找到了解决办法

$results = $mongo->command(array(
  'aggregate' => 'users_collection',
  'pipeline' => $pipeline,
  'allowDiskUse' => true
));

在我看来,因为 php 允许使用两种方法(来自 php.net

public array MongoCollection::aggregate ( array $pipeline [, array $options ] )

public array MongoCollection::aggregate ( array $op [, array $op [, array $... ]] )

它将我的$options 数组视为另一个操作$op。也许这与我们正在使用的 Mongo 模块的版本或类似的东西有关,但更改为 $mongo->command() 是一种解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2022-11-23
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多