在MongoDB集合中的每个文档中添加新字段

466

我该如何为现有集合中的每个文档添加一个新字段?

我知道如何更新现有文档的字段,但不知道如何为集合中的每个文档添加一个新字段。我该如何在 mongo shell 中实现这个操作?

7个回答

749

与更新现有集合字段相同,$set会在指定字段不存在时添加新的字段。

看看这个例子:

> db.foo.find()
> db.foo.insert({"test":"a"})
> db.foo.find()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "test" : "a" }
> item = db.foo.findOne()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "test" : "a" }
> db.foo.update({"_id" :ObjectId("4e93037bbf6f1dd3a0a9541a") },{$set : {"new_field":1}})
> db.foo.find()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "new_field" : 1, "test" : "a" }

编辑:

如果你想要向所有集合添加一个新字段,你需要使用空选择器,并将multi标志设置为true(最后一个参数),以便更新所有文档。

db.your_collection.update(
  {},
  { $set: {"new_field": 1} },
  false,
  true
)

编辑:

在上面的例子中,最后2个字段false, true指定了upsertmulti标志。

Upsert:如果设置为true,则在没有文档匹配查询条件时创建一个新文档。

Multi:如果设置为true,则更新满足查询条件的多个文档。如果设置为false,则只更新一个文档。

这是针对Mongo 2.2版本之前的版本。对于最新版本,查询有些不同。

db.your_collection.update({},
                          {$set : {"new_field":1}},
                          {upsert:false,
                          multi:true}) 

8
可以创造没有价值的东西吗? - Yasar Arafath
12
db.your_collection.update({}, {$set : {"new_field":null}}, {upsert:false, multi:true}) 翻译为中文: 将db.your_collection集合中的所有文档的"new_field"字段设为null,不插入新文档,可修改多个文档。 - Nilesh
1
如果我想创建一个空数组怎么办? - Prashant Pokhriyal
4
@PrashantPokhriyal db.your_collection.update({}, {$set : {"new_field":[]}}, {upsert:false, multi:true}) - Máxima Alekz
5
如果你想要创建一个具有动态赋值的新字段,该怎么做呢?例如,我想让new_field成为一个整数,其值等于test字段中字符串的长度。 - qed
显示剩余11条评论

81
自MongoDB 3.2版本起,您可以使用updateMany()方法:
> db.yourCollection.updateMany({}, {$set:{"someField": "someValue"}})

3
我认为 updateMany 更易读。 - francis
我该如何将其实现到对象数组中?例如some_arr[{_id:1},{_id:2},{_id:1}]。我想在集合中的所有MongoDB文档中的每个对象中添加一个新字段状态。 - ARHAM RUMI

26

为了澄清,MongoDB 4.0.x版本的语法如下:

db.collection.update({},{$set: {"new_field*":1}},false,true)

这是一个工作示例,向articles集合添加published字段,并将该字段的值设置为true

db.articles.update({},{$set: {"published":true}},false,true)

1
使用 updateMany 会更加合适。 - w.Daya

22
db.collection.updateMany({}, {$set: {"fieldName": ""}})

updateMany要求每个文档都有一个匹配条件,因为我们传递了{},所以它总是为真。第二个参数使用$set操作符在每个文档中添加所需的字段。


2
虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Suraj Rao

5

Pymongo 3.9+

update()已经被弃用,现在应该使用replace_one()update_one()update_many()

在我的情况下,我使用了update_many(),解决了我的问题:

db.your_collection.update_many({}, {"$set": {"new_field": "value"}}, upsert=False, array_filters=None)

是 "update_many" 还是 "updateMany"? - Abdulhakim
@Abdulhakim 这是update_many - Ghasem
大家好,我能否从一个包含每个文档不同值的数组中为每个文档添加一个新字段? - JAbr
@JAbr 我不知道答案,但最好开一个新问题,因为除非它们是原始问题的后续问题,否则人们通常不会在评论中回答新问题。 - RobertSF
1
针对Mongodb shell,updateMany是其命令。 - Bersan

2

以上的回答没有涉及到这种情况。我正在寻找类似的查询,但是希望根据条件向一些文档添加字段

因此,我们可以使用updateMany的第一个变量仅在一些文档中更新字段。

示例:我想向所有用户类型为雇主且国家为“AAA”的用户添加一个可空字段isDeprecated?

db.users.updateMany({"userType": "Employer", "country": "AAA"}, {"$set": { "isDeprecated?": true }})  

这个答案对于需要查找集合并更新的情况也很有帮助。可以使用单个查询来完成,如下所示。


2
如果您正在使用mongoose,请在mongoose连接之后尝试以下操作。
async ()=> await Mongoose.model("collectionName").updateMany({}, {$set: {newField: value}})

嘿,@Edgar,你能否通过举例来更详细地解释一下这个问题,并分享一下你找到的文档吗? - Rohan Devaki
嗨@RohanDevaki,是的,在https://mongoosejs.com/docs/models.html的“更新”部分中,在该页面中您可以看到示例:“Tank”模型= Mongoose.model(“Tank”),而updateMany函数则可以在https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/中找到。 - Edgar Olivar
但是在设置新字段时,您还需要提及新字段的类型,您在哪里提及了类型,并且您必须添加是否必需以及如何添加这些信息? - Rohan Devaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接