MongoDB: обновить каждый документ на одном поле - PullRequest
188 голосов
/ 27 января 2012

У меня есть сборник с именем foo гипотетически.

Каждый экземпляр foo имеет поле lastLookedAt, которое является отметкой времени UNIX с начала эпохи. Я хотел бы иметь возможность пройти через клиент MongoDB и установить эту метку времени для всех существующих документов (около 20 000 из них) на текущую метку времени.

Какой лучший способ справиться с этим?

Ответы [ 3 ]

404 голосов
/ 27 января 2012

В оболочке Mongo или с любым клиентом Mongodb:

• Для Mongodb> = 3.2:

db.foo.updateMany({}, {$set: {lastLookedAt: Date.now() / 1000}})

См. http://docs.mongodb.org/manual/tutorial/modify-documents/#update-multiple-documents

  • {} - это условие (пустое условие соответствует любому документу)
  • {$set: {lastLookedAt: Date.now() / 1000}} - это то, что вы хотите сделать

• Для Mongodb> = 2.2:

db.foo.update({}, {$set: {lastLookedAt: Date.now() / 1000}}, { multi: true })

См. http://docs.mongodb.org/manual/tutorial/modify-documents/#update-multiple-documents

  • {} - это условие (пустое условиесоответствует любому документу)
  • {$set: {lastLookedAt: Date.now() / 1000}} - это то, что вы хотите сделать
  • {multi: true} - это опция «обновить несколько документов»

• ДляMongodb <2.2: </strong>

db.foo.update({}, {$set: {lastLookedAt: Date.now() / 1000}}, false, true)

См. https://web.archive.org/web/20120613233453/http://www.mongodb.org/display/DOCS/Updating

  • {} - это условие (пустое условие соответствует любому документу)
  • {$set: {lastLookedAt: Date.now() / 1000}} - это то, что вы хотите сделать
  • false - для параметра "upsert" (вставьте, если его нет, или обновите - не то, что вы хотите)
  • true для параметра "multi" (обновить несколько записей)
7 голосов
/ 24 марта 2016

Этот код будет вам полезен

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  
4 голосов
/ 27 января 2012

Я пользуюсь драйвером MongoDB .NET чуть больше месяца. Если бы я делал это с помощью драйвера .NET, я бы использовал метод Update для объекта коллекции. Сначала я создам запрос, который получит все интересующие меня документы и обновит поля, которые я хочу изменить. Обновление в Mongo влияет только на первый документ и для обновления всех документов, полученных в результате запроса, необходимо использовать флаг обновления «Multi». Пример кода следующий ...

var collection = db.GetCollection("Foo");
var query = Query.GTE("No", 1); // need to construct in such a way that it will give all 20K //docs.
var update = Update.Set("timestamp", datetime.UtcNow);
collection.Update(query, update, UpdateFlags.Multi);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...