2014-02-21 1 views
0

У меня есть коллекция, в которой я хотел бы обновить дату в каждой записи со случайным временем за последние несколько часов. Я использую обновление ниже:Обновление каждой записи в коллекции со случайным временем?

db.users.update(
    {}, 
    { 
     $set: 
     { 
      loggedIn: new Date((ISODate().getTime() - 1000*60*(ISODate().getTime()%300))) 
     } 
    }, 
    false, 
    true 
); 

Но это обновляет каждую запись с таким же случайным временем. Как я могу получить часть 1000*60*(ISODate().getTime()%300 для выполнения с каждым обновлением вместо того, чтобы выполнять один раз, а затем обновлять записи с тем же значением?

+0

Вы бы перебирать каждую запись и устанавливать ее? (Просто догадаться) – tymeJV

+0

Есть ли причина, почему этот вопрос по-прежнему открыт? –

+0

Все еще открыта, так как не принимается к ответу или открыта? –

ответ

2

Правильно. Операция является атомарной, и «случайное значение даты» здесь оценивается один раз, затем применяется ко всем записям с вашим обновлением multi.

Так в любом программировании реализации вы хотите итеративно:

db.users.find({}).foreach(function(user) { 

    db.users.update({ _id: user._id }, 
    { 
     $set: 
     { 
      loggedIn: new Date((ISODate().getTime() - 1000*60*(ISODate().getTime()%300))) 
     } 
    }); 

}; 

Там есть работа на batch updates, но даже так вам нужно будет сгенерировать «случайное время» для каждого документа