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

214

У меня есть сборник названный foo гипотетически.

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

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

randombits
источник
Возможный дубликат MongoDB: Как обновить несколько документов одной командой?
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

458

Независимо от версии, для вашего примера, <update>это:

{  $set: { lastLookedAt: Date.now() / 1000 }  }

Однако, в зависимости от вашей версии MongoDB, запрос будет выглядеть по-разному. Независимо от версии ключ заключается в том, что пустое условие {}будет соответствовать любому документу . В оболочке Mongo или с любым клиентом MongoDB:

$ version> = 3.2 :

db.foo.updateMany( {}, <update> )
  • {} это условие (пустое условие соответствует любому документу)

3.2> $ version> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} это условие (пустое условие соответствует любому документу)
  • {multi: true} это опция "обновить несколько документов"

$ версия <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} это условие (пустое условие соответствует любому документу)
  • falseдля параметра " upsert "
  • true для параметра "multi" (обновить несколько записей)
Филипп Плантье
источник
Date.now () также возвращает отметку времени. См. Developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Филипп Плантье
Он до сих пор дает мне дату, которая не подходит для всех этих случаев foo. После запуска я делаю db.foo.findOne () и lastLookedAt: 1327691719186, что переводится в jruby-1.6.5: 011> Time.at (1327691719186) => Вс 16 ноября 02:19:46 -0500 44042
randombits
1
Мое плохое время POSIX использует секунды, тогда как время Javascript использует миллисекунды. Date.now () / 1000 должен работать, хотя. Возможно, вам придется округлить его.
Филипп Плантье
psh это так пусто {}, что сделал это для меня, спасибо Фил
Jona
1
Как это сделать для oldvalue + "некоторая строка"
Mahesh K
11

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

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  
Jitendra
источник
4

Я использую драйвер 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);
user1163459
источник