【问题标题】:MongoDB Aggregate Projection working differently than find ProjectionMongoDB Aggregate Projection 的工作方式与 find Projection 不同
【发布时间】:2015-10-27 13:58:50
【问题描述】:

我有一个关于在我的 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的结果没有折叠。我期望与聚合函数相同的 form ;减去结果和 OK 属性。

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

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    不,您无法使用find() 获得完全相同的输出,因为您无法在使用find() 方法时引入新字段。您甚至获得该结果的原因是因为category 是您集合中的字段名称。 .find() 方法中的投影参数用于在查询结果中显式包含或排除字段,并且与 $project 没有并且完全不同,$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" } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多