2

我可能对 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 步骤。它基于原始输入,并包含 state != CA 的文档:

    {
        "city" : "THAYNE",
        "pop" : 505,
        "state" : "WY",
        "_id" : "83127"
    }

是我的期望错位了,还是我一直盯着语法问题而没有看到它?我正在运行 2.2.0 版:

> db.version();
2.2.0

示例查询似乎有效。

提前致谢。

4

1 回答 1

3

这是一个语法问题,你正在做:

db.zips.aggregate({$match:{state:"CA"}, $project: {city: 1, pop: 1, state: 1}})

... 在同一个文档中包含 $match 和 $project 这两个字段。聚合命令采用一系列不同的文档来描述管道的各个阶段:

db.zips.aggregate({$match:{state:"CA"}}, {$project: {city: 1, pop: 1, state: 1}})

显然,如果您将多个字段放在管道阶段,MongoDB 只使用最后一个。这是已在下一个开发分支上修复的错误:https ://jira.mongodb.org/browse/SERVER-6861

于 2012-10-29T14:27:48.083 回答