Mongodb$match和$project聚合

Mongodb$match和$project聚合,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一套非常简单的文件 > db.ysTest.aggregate({$project:{_id:1,unitStatus:1}}); { "result" : [ { "_id" : ObjectId("514309f3e18aa7d14100217a"), "unitStatus" : "es_pws" }, { "_id" : ObjectId("514309f3e18aa7d141002816"),

我有一套非常简单的文件

> db.ysTest.aggregate({$project:{_id:1,unitStatus:1}});
{
"result" : [
    {
        "_id" : ObjectId("514309f3e18aa7d14100217a"),
        "unitStatus" : "es_pws"
    },
    {
        "_id" : ObjectId("514309f3e18aa7d141002816"),
        "unitStatus" : "es_run"
    },
    {
        "_id" : ObjectId("514309f0e18aa7d14100021e")
    }
],
"ok" : 1
}
当使用$match和$project使用'aggregate'时,我希望有一个文档,但我得到了所有文档。 注意:我使用聚合是因为这将是一个更复杂匹配的一部分,但在本例中我尽量保持简单

> db.ysTest.aggregate({
... $match: {
...   unitStatus: {$exists: true, $nin: ["es_pws", "es_stl"]}
... },
... $project: {_id: 1,unitStatus:1}
... });
{
"result" : [
    {
        "_id" : ObjectId("514309f3e18aa7d14100217a"),
        "unitStatus" : "es_pws"
    },
    {
        "_id" : ObjectId("514309f3e18aa7d141002816"),
        "unitStatus" : "es_run"
    },
    {
        "_id" : ObjectId("514309f0e18aa7d14100021e")
    }
],
"ok" : 1
}

我做错了什么

通过查看文档、查询和注释,很明显您没有使用
$group
运算符,
$match
只是一个select子句,它根据给定的条件过滤结果。就你而言

... $match: {
...   unitStatus: {$exists: true, $nin: ["es_pws", "es_stl"]}
... }

但是
$match
$group
并不保证它将返回一个文档。您的模式、查询条件有什么保证。

您打算分组吗?您需要一个{$group}阶段来指定如何对文档进行分组以及需要什么聚合。这是一个微妙的错误,请在逗号之前关闭$match和另一个},并在$project之前添加一个{,它将按照您希望的方式工作:db.ysTest.aggregate({$match:{unitStatus:{$exists:true,$nin:[“es_pws”,“es_stl”]}},{$project:{{u id:1,unitStatus:1}});您是否尝试过
unitStatus:{$exists:true}
以确保您的语法不正确(括号放错了位置),但如果您修复了它,它对我来说可以正常工作。不过,您的语法会出现错误。请注意,您的语法没有a{'在$project前面-这使它成为一个字段,而不是聚合运算符,并给出了一个语法错误。是的,这是真的…我的语法完全错误。我使用的是mongodb+nodejs驱动程序,与shell中的有点不同。无论如何,这解决了我的问题,谢谢!