我该如何为现有集合中的每个文档添加一个新字段?
我知道如何更新现有文档的字段,但不知道如何为集合中的每个文档添加一个新字段。我该如何在 mongo
shell 中实现这个操作?
与更新现有集合字段相同,$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
指定了upsert
和multi
标志。
Upsert:如果设置为true,则在没有文档匹配查询条件时创建一个新文档。
Multi:如果设置为true,则更新满足查询条件的多个文档。如果设置为false,则只更新一个文档。
这是针对Mongo 2.2
版本之前的版本。对于最新版本,查询有些不同。
db.your_collection.update({},
{$set : {"new_field":1}},
{upsert:false,
multi:true})
> db.yourCollection.updateMany({}, {$set:{"someField": "someValue"}})
updateMany
更易读。 - francissome_arr[{_id:1},{_id:2},{_id:1}]
。我想在集合中的所有MongoDB文档中的每个对象中添加一个新字段状态。 - ARHAM RUMI为了澄清,MongoDB 4.0.x版本的语法如下:
db.collection.update({},{$set: {"new_field*":1}},false,true)
这是一个工作示例,向articles集合添加published字段,并将该字段的值设置为true:
db.articles.update({},{$set: {"published":true}},false,true)
updateMany
会更加合适。 - w.Dayadb.collection.updateMany({}, {$set: {"fieldName": ""}})
updateMany
要求每个文档都有一个匹配条件,因为我们传递了{}
,所以它总是为真。第二个参数使用$set
操作符在每个文档中添加所需的字段。
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)
以上的回答没有涉及到这种情况。我正在寻找类似的查询,但是希望根据条件向一些文档添加字段
。
因此,我们可以使用updateMany
的第一个变量仅在一些文档中更新字段。
示例:我想向所有用户类型为雇主且国家为“AAA”的用户添加一个可空字段isDeprecated?
。
db.users.updateMany({"userType": "Employer", "country": "AAA"}, {"$set": { "isDeprecated?": true }})
这个答案对于需要查找集合并更新的情况也很有帮助。可以使用单个查询来完成,如下所示。
async ()=> await Mongoose.model("collectionName").updateMany({}, {$set: {newField: value}})
new_field
成为一个整数,其值等于test
字段中字符串的长度。 - qed