Добавить новое поле в каждый документ в коллекции MongoDB


335

Как я могу добавить новое поле для каждого документа в существующей коллекции?

Я знаю, как обновить поле существующего документа, но не знаю, как добавить новое поле в каждый документ в коллекции. Как я могу сделать это в mongoоболочке?

Ответы:


601

Аналогично обновлению существующего поля коллекции, $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определяет upsertи multiфлаги.

Upsert: если задано значение true, создает новый документ, когда ни один документ не соответствует критериям запроса.

Multi: если установлено значение true, обновляет несколько документов, соответствующих критериям запроса. Если установлено значение false, обновляется один документ.

Это для Монго 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
Что делать, если я хочу создать пустой массив?
Прашант Похриял

3
@PrashantPokhriyal db.your_collection.update ({}, {$ set: {"new_field": []}}, {upsert: false, multi: true})
Максима Алекс

3
Что если вы хотите создать новое поле со значением, назначенным динамически? Например, я хотел бы, new_fieldчтобы int был равен длине строки в testполе.
от

3

Чтобы уточнить, синтаксис для MongoDB версии 4.0.x выглядит следующим образом:

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

Вот рабочий пример добавления опубликованного поля в коллекцию статей и установки значения поля в 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.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.