【问题标题】:How to exclude _id without including other fields using the aggregation framework如何使用聚合框架排除_id而不包含其他字段
【发布时间】:2013-10-07 14:44:20
【问题描述】:

我想获得没有 _id 字段的聚合管道的结果。我知道如果您明确提供将作为投影输出的其他字段,这是可能的。但是,¿如何在 find 调用中模仿 $projec?

这就是我想要的(没有明确包含的字段):

db.col.find({},{_id:0})

但在聚合框架中似乎是不可能的:

db.col.aggregate([{'$project': {_id:0}}])

Error: Printing Stack Trace
    at printStackTrace (src/mongo/shell/utils.js:37:15)
    at DBCollection.aggregate (src/mongo/shell/collection.js:927:9)
    at (shell):1:11
2013-10-07T16:36:09.273+0200 aggregate failed: {
    "errmsg" : "exception: $projection requires at least one output field",
    "code" : 16403,
    "ok" : 0
} at src/mongo/shell/collection.js:928

有解决此问题的方法吗?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    使用聚合时,您必须明确地include/exclude fields。因此,您需要列出所需的所有字段。它不等同于find。所以,你可以:

    db.sample.aggregate(
        { $project : {
            _id : 0,
            title : 1             
        }}
    );
    

    使用聚合框架还附带一些limits 你应该注意的。它是为聚合(分组、求和等)而设计的,因此在投影中包含许多字段并不常见(并且可能导致结果超过允许的最大值,即 16MB)。

    【讨论】:

    • Mongodb 2.6 将克服这些限制...“通过返回游标,聚合管道可以返回任何大小的结果集”docs.mongodb.org/manual/release-notes/2.6 我正在尝试 2.5.2,但仍然需要显式包含字段。真遗憾。 :(
    • 当然,未来的版本可能会取消这些限制。但是,就目前而言,情况就是这样。聚合框架仍然最适合分组等,在这些情况下,返回许多字段通常没有意义。
    • 你太棒了!最后我解决了这个问题!加一个我的
    猜你喜欢
    • 2016-10-22
    • 2017-11-04
    • 1970-01-01
    • 2022-11-12
    • 2019-03-30
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多