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


334

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

我知道如何更新现有文档的字段,但不知道如何向集合中的每个文档添加新字段。如何在mongo外壳中执行此操作?

Answers:


598

与更新现有集合字段相同,$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" }

编辑:

如果要向所有集合中添加new_field,则必须使用空选择器,并将multi标志设置为true(最后一个参数)以更新所有文档

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

编辑:

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

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

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

这是Mongo versions之前的2.2。对于最新版本,查询有所更改

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

7
有可能创造没有价值的
东西吗

7
db.your_collection.update({},{$ set:{“ new_field”:null}},{upsert:false,multi:true})
Nilesh

1
如果我想创建一个空数组怎么办?
Prashant Pokhriyal

3
@PrashantPokhriyal db.your_collection.update({},{$ set:{“ new_field”:[]}},{upsert:false,multi:true})
MáximaAlekz

3
如果要创建具有动态分配值的新字段怎么办?例如,我想必须new_field是一个等于test字段中字符串长度的int 。
QED

3

为了明确起见,MongoDB 4.0.x版的语法如下:

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

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

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

0

皮蒙哥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(filter, update, upsert=False, array_filters=None, bypass_document_validation=False, collation=None, session=None)


filter: A query that matches the documents to update.

update: The modifications to apply.

upsert (optional): If True, perform an insert if no documents match the filter.

bypass_document_validation (optional): If True, allows the write to opt-out of document level validation. Default is False.

collation (optional): An instance of Collation. This option is only supported on MongoDB 3.4 and above.

array_filters (optional): A list of filters specifying which array elements an update should apply. Requires MongoDB 3.6+.

session (optional): a ClientSession.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.