聚合时如何不将项目中的所有字段一一列出?

问题描述 投票:0回答:3

我使用的是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:保留以前的管道字段

包含所有现有字段并向文档添加新字段

如何在项目中不把每个字段都一一写出来

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

mongodb mongodb-query
3个回答
24
投票

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

{ $project: { _id: 0 } }

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

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


4
投票

你可以使用$replaceRoot

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

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


0
投票

我从你的问题中了解到,你想更新一些现有的字段并保持其他字段不变。
正如您在问题中所说,

$addFields
是您的解决方案。
根据 mongoDB 网站:

如果新字段的名称与现有字段名称(包括 _id)相同,则 $addFields 会使用指定表达式的值覆盖该字段的现有值。

上面说您可以使用

$addFields
来更新现有字段。
因此,您可以使用此运算符来更新字段,而无需显式列出剩余字段。

© www.soinside.com 2019 - 2024. All rights reserved.