MongoDB Aggregate Projection的工作方式与查找Projection不同

时间:2015-10-27 13:58:50

标签: mongodb mongodb-query aggregation-framework

我有一个关于在MongoDB查找查询中使用投影的问题。我的问题如下,我的文件如下:

{
    "_id" : ObjectId("55e59045cded246cb8e8183e"),
    "name" : "Acrobatics",
    "category" : {
        "title" : "Combat",
        "key" : "combat"
    },
    "calculationType" : "Skill",
    "statistics" : "INI",
    "title" : "Acrobatics"
}

我的汇总查询如下:

db.getCollection('skills').aggregate([
    { $match: { "category.title": "Combat" } },
    { $project: { "_id": 0, "name": 1, "category": "$category.title" } }
]);

结果如您所料:

{
    "result" : [ 
        {
            "name" : "Acrobatics",
            "category" : "Combat"
        }
    ],
    "ok" : 1.0000000000000000
}

现在我想使用find方法而不是聚合进行相同的投影,我的查询看起来像:

db.getCollection('skills').find(
    { "category.key": "combat" },
    { "_id": 0, "name": 1, "category": "$category.title" }
);

结果如下:

[{
    "name" : "Acrobatics",
    "category" : {
        "title" : "Combat",
        "key" : "combat"
    }
}]

正如您在查找中看到的那样,子文档 category 的结果未折叠。我期望与聚合函数相同的形式;减去结果和OK属性。

我做错了吗?或者我的期望是错的?感谢您阅读本文。

1 个答案:

答案 0 :(得分:2)

不能使用find()无法获得完全相同的输出,因为您无法在使用find()方法时引入新字段。您获得该结果的原因是因为category是您的集合中的字段名称。 .find()方法中的投影参数用于从查询结果中明确包含或排除字段,但不会与允许您重新整形文档或包含新计算字段的$project完全不同在结果中。

例如以下内容:

db.getCollection('skills').find({ "category.key": "combat" }, { "name": 1, "_id": 0, "cat": "$category.title" })

收益率

{ "name" : "Acrobatics" }

因为文档中没有名为cat的字段。如果您想要的只是标题字段,那么您可以使用:

db.skills.find({ "category.key": "combat" }, { "name": 1, "_id": 0, "category.title": 1 })

返回:

{ "name" : "Acrobatics", "category" : { "title" : "Combat" } }