【问题标题】:How to not list all fields one by one in project when aggregating?聚合时如何不将项目中的所有字段一一列出?
【发布时间】:2018-01-22 21:51:17
【问题描述】:

我正在使用 Mongo 3.2.14

我有一个如下所示的 mongo 集合:

{
'_id':...
'field1':...
'field2':...
'field3':...
etc...
}

我想这样聚合:

db.collection.aggregate{
                        '$match':{},
                        '$project':{
                                    'field1':1,
                                    'field2':1,
                                    'field3':1,
                                    etc...(all fields)
                                    }
                        }

有没有一种方法可以在不逐一列出每个字段的情况下包含项目中的所有字段? (我有大约 30 个领域,并且还在不断增长……)

我在这里找到了相关信息:

MongoDB $project: Retain previous pipeline fields

Include all existing fields and add new fields to document

how to not write every field one by one in project

但是,我使用的是 mongo 3.2.14,并且不需要创建新字段,因此,我认为我不能使用 $addFields。但是,如果可以的话,谁能告诉我如何使用它?

【问题讨论】:

  • “我有 30 个字段并且还在不断增长...” 好的,那太好了,您实际上查看了一些答案,但是您的问题实际上并没有告诉我们除了该声明之外的任何内容.问题是什么? $projectA 工作,仅包括您明确要求 B 的字段或通过 排除 您明确要求它执行的字段。您实际上并没有解释您真正在做什么。我在这里看到的是$match$project,根本没有理由说明为什么需要包含这些字段或排除或管道的其余部分需要是什么。解释你的情况
  • “有没有办法在不逐一列出每个字段的情况下包含项目中的所有字段?(我有大约 30 个字段,并且还在增长......)”我的问题开始于“(我有大约 30 个领域,并且还在不断增长……)”如果有帮助的话……

标签: mongodb mongodb-query


【解决方案1】:

基本上,如果您希望将文档的所有属性传递到下一个管道,您可以跳过 $project 管道。但是如果你想要除“_id”值之外的所有属性,那么你可以通过

{ $project: { _id: 0 } }

这将返回除 _id 之外的所有值。

如果您有嵌入的列表或嵌套想要展平,您可以使用 $unwind 管道

【讨论】:

  • 谢谢,我不知道你可以完全跳过 $project 管道。我还注意到,如果我这样做 { $project: { _id: 0 } },那么我必须明确地一一列出我想要的所有字段。因此,我决定包含“_id”并在将其放入数据框后删除该字段。
【解决方案2】:

你可以使用 $replaceRoot

db.collection.aggregate{
    "$match": {},
    "$project": {
        "document": "$$ROOT"
    },
    {
        "$replaceRoot": { "newRoot": "$document" }
    }

通过这种方式,您可以获得文档中所有字段返回的确切文档...您无需在 $project 中一一添加每个字段...尝试在末尾使用 $replaceRoot管道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2020-11-27
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多