MongoDB聚合框架不保留$ addFields添加的内容

时间:2018-04-09 23:07:16

标签: mongodb aggregation-framework

添加字段但随后消失。 这是mongo shell中的代码:

> db.users.aggregate([{$addFields:{totalAge:{$sum:"$age"}}}])
{ "_id" : ObjectId("5acb81b53306361018814849"), "name" : "A", "age" : 1, "totalAge" : 1 }
{ "_id" : ObjectId("5acb81b5330636101881484a"), "name" : "B", "age" : 2, "totalAge" : 2 }
{ "_id" : ObjectId("5acb81b5330636101881484b"), "name" : "C", "age" : 3, "totalAge" : 3 }
> db.users.find().pretty()
{ "_id" : ObjectId("5acb81b53306361018814849"), "name" : "A", "age" : 1 }
{ "_id" : ObjectId("5acb81b5330636101881484a"), "name" : "B", "age" : 2 }
{ "_id" : ObjectId("5acb81b5330636101881484b"), "name" : "C", "age" : 3 }

3 个答案:

答案 0 :(得分:3)

仅汇总从您的收藏中读取数据;它也不会编辑集合。考虑聚合的最佳方式是您阅读一些数据并对其进行操作以便立即使用。

如果您想在主要来源中进行更改,则必须使用更新方法。

或者更简单的方式(不是最好但很容易)

db.users.aggregate([{$addFields:{totalAge:{$sum:"$age"}}}]).forEach(function (x){
    db.users.save(x)
})

答案 1 :(得分:0)

原因是,您的两种方法完全不同。在聚合中,您在该查询中使用 $ addFields ,您将获得 totalAge 。但是根据您的查找查询,您可以获得存储在数据库中的特定数据。这里没有计算 totalAge

我希望你能理解它。

答案 2 :(得分:0)

汇总管道不会改变原始数据;它的作用是获取数据的临时内存副本并对其执行一系列操作(仍在内存中)并将其发送到客户端。

它类似于db.collection.find().sort()的方式;那里的排序只会改变返回给客户端的内容,它不会改变数据库中存储的内容。

唯一的异常是指使用$out stage时,它会将聚合结果保存到另一个集合中。您可以看到,因为他们必须添加一种特殊类型的阶段才能执行此操作,正常聚合不会写回存储的数据。