0

下面的查询在 Studio 3T 和 Robomongo 中运行良好,但我想将其转换为 PHP 格式,

以下是我的查询,

db.news.aggregate([
{
      $match: {  "_id" : "1" }
},
{
    "$project": {
        "comments": {
            "$filter": { 
                "input": "$comments",
                "as": "comment", 
                "cond": { "$eq": [ "$$comment.status", "active" ] } 
            }
        } 
    }
}, {
    "$project": {
        "comments": {
            "$slice": [
                {
                    "$slice": [
                        "$comments",
                        {
                            "$subtract": [ { "$size": [ "$comments" ] }, 1 ]
                        }
                    ]
                }, -1
            ]
        }
    }
}])

我在下面尝试过,但它给出了错误“ Error: localhost:27017: FieldPath field names may not be empty strings.

PHP转换示例:

<?php
        $commentsAggregate=array(
                            array('$match' => array("_id" => "1")),
                            array('$project' => array(
                                    "comments" => array(
                                        '$filter' => array(
                                            "input" => "$comments",
                                            "as" => "comment",
                                            "cond" =>  array('$eq' => array( "$$comment.status", 'active'))
                                    )))),
                            array('$project' => array(
                                "comments" => array(
                                '$slice' => array(array(
                                        '$slice' => array("$comments",array('$subtract' => array( array( '$size' => array("$comments")),1)))
                                        ), -1)
                                )))
                        );
$cursor=$collectionNews->aggregate($commentsAggregate);

请帮我转换上面的查询。

4

1 回答 1

2

错误消息“FieldPath 字段名称可能不是空字符串”源自服务器。查看您提供的示例 PHP 代码,我注意到您不一致地使用单引号和双引号字符串。特别是,这两个字符串脱颖而出:

  • "$$comment.status"
  • "$comment"

PHP 正在评估双引号字符串中的变量引用。假设本地范围实际上没有$comment定义变量,这些字符串将分别解析为"$.status"""。正如3v4l.org 上的这个脚本和执行输出所证明的那样,这些示例至少应该导致一个未定义变量的 PHP 通知(我的本地 PHP 配置恰好在“错误”级别报告了这一点)。如果您没有该错误消息的记录,我会建议以下内容:

  • 检查您的error_reporting配置。
  • 理想情况下,您应该报告E_ALL开发环境中的所有内容 ( )。完整报告对于生产也是可取的,尽管您可能希望禁用display_errors(出于安全考虑)并确保正确记录所有内容。
  • 如果事实证明错误记录,请查看在调试此问题时是如何遗漏的。

至于解决根本原因,在 PHP 中编写 MongoDB 查询/命令时应注意使用单引号字符串。文档中有关于此的注释MongoCollection::find(),但我们不会在每一页上重复此内容,因为 PHP 的双引号字符串评估超出了驱动程序的控制范围。

于 2018-02-17T05:25:32.687 回答