我可能对mongodb聚合框架管道如何工作有一个基本的误解。我的期望是每一步消耗前一步的输出。以下是使用http://media.mongodb.org/zips.json提供的示例集合的具体示例:
> db.zipcodes.aggregate({$match:{state:"CA"}});
产生这样的结果。
{
"city" : "TRUCKEE",
"loc" : [
-120.295031,
39.319321
],
"pop" : 199,
"state" : "CA",
"_id" : "96162"
}
到目前为止一切顺利。然后我决定通过运行:添加另一个步骤以获得上述内容的投影
> db.zipcodes.aggregate({
$match:{state:"CA"},
$project: {city: 1, pop: 1, state: 1}
});
投影有效,但忽略了第一个$ match步骤。它基于原始输入,包括状态!= CA:
的文档 {
"city" : "THAYNE",
"pop" : 505,
"state" : "WY",
"_id" : "83127"
}
我的期望是否错位或者我是否一直盯着语法问题而没有看到它?我正在运行2.2.0版本:
> db.version();
2.2.0
例如,查询似乎有效。
提前致谢。
答案 0 :(得分:4)
这是一个语法问题,你正在做:
db.zips.aggregate({$match:{state:"CA"}, $project: {city: 1, pop: 1, state: 1}})
...在同一文档中包含两个字段$ match和$ project。 aggregate命令采用一系列不同的文档来描述管道的各个阶段:
db.zips.aggregate({$match:{state:"CA"}}, {$project: {city: 1, pop: 1, state: 1}})
显然,如果在管道阶段放置几个字段,MongoDB只使用最后一个字段。这是在下一个开发分支上修复的错误:https://jira.mongodb.org/browse/SERVER-6861