以下查询在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);
请帮我转换以上查询。
答案 0 :(得分:2)
错误消息“FieldPath字段名称可能不是空字符串”源自the server。查看您提供的示例PHP代码,我注意到您使用单引号和双引号字符串时不一致。特别是,这两个字符串突出:
"$$comment.status"
"$comment"
PHP正在评估双引号字符串中的变量引用。假设本地范围实际上没有定义$comment
变量,那么这些字符串将分别解析为"$.status"
和""
。正如this script and execution output on 3v4l.org中所证明的那样,这些示例至少会导致PHP通知中出现未定义的变量(我的本地PHP配置恰好在“错误”级别报告此情况)。如果您没有该错误消息的记录,我建议如下:
error_reporting
配置。E_ALL
)。完整报告也适用于生产,尽管您可能希望禁用display_errors
(为了安全),而是确保所有内容都已正确记录。至于修复根本原因,在PHP中编写MongoDB查询/命令时应注意使用单引号字符串。在MongoCollection::find()
文档中有一个关于此的注释,但这不是我们在每个页面上重复的内容,因为PHP的double-quoted string evaluation不受驱动程序的控制。