我使用的是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 个字段,并且还在不断增长......)
我在这里找到了相关信息:
但是,我使用的是 mongo 3.2.14,并且不需要创建新字段,因此,我认为我无法使用 $addFields。但是,如果可以的话,有人可以告诉我如何使用它吗?
基本上,如果您希望将文档的所有属性传递到下一个管道,您可以跳过 $project 管道。但如果你想要除“_id”值之外的所有属性,那么你可以通过
{ $project: { _id: 0 } }
它将返回除 _id 之外的所有值。
如果您有嵌入的列表或嵌套想要展平,您可以使用 $unwind 管道
你可以使用$replaceRoot
db.collection.aggregate{
"$match": {},
"$project": {
"document": "$$ROOT"
},
{
"$replaceRoot": { "newRoot": "$document" }
}
通过这种方式,您可以获得包含文档中所有字段的精确文档...您不需要在 $project 中逐一添加每个字段...尝试在管道末尾使用 $replaceRoot 。
我从你的问题中了解到,你想更新一些现有的字段并保持其他字段不变。
正如您在问题中所说,
$addFields
是您的解决方案。如果新字段的名称与现有字段名称(包括 _id)相同,则 $addFields 会使用指定表达式的值覆盖该字段的现有值。
上面说您可以使用
$addFields
来更新现有字段。