2016-09-26 3 views
0

Я пытаюсь обновить поле для каждого документа в коллекции MongoDB.Обновление поля во всех документах MongoDB с Javascript

Я добавил поле из оболочки Mongo, но хочу изменить значение каждого поля на случайное число.

User.find({}, function(err, items){ 
    if (err){ 
    consele.log('err'); 
    consele.log(err); 
    } 
    items.forEach(function(item){ 
    var time = (Math.floor(Math.random() * (1474893715201 - 1474800000000) + 1474800000000)); 
    item.update({}, {$set:{"lastLogin": time}}, false, true); 
    }); 
}); 

Если я console.log (элемент) в цикле .forEach, я получаю каждый документ в коллекции, как я ожидал, так что все до, кажется, работает.

Может ли кто-нибудь увидеть, где я ошибаюсь?

Спасибо народу!

+0

Если вы делаете это с Node.js затем ожидать операция обновления должна быть асинхронной, а также иметь в виду, что асинхронные запросы находятся в цикле for, что означает, что некоторые документы могут не обновляться. Скорее используйте массовый API для таких обновлений с помощью Promises или асинхронной библиотеки. – chridam

ответ

0

Звонки Api асинхронны, вам придется обернуть это в обещание или асинхронную библиотеку, чтобы выполнить сделанные изменения сборки.

В качестве альтернативы вы можете также сделать объемность найти и обновление через Монго в одном вызове: https://docs.mongodb.com/manual/reference/method/Bulk.find.update/

var bulk = db.items.initializeUnorderedBulkOp(); 
bulk.find({ status: "D" }).update({ $set: { status: "I", points: "0" } }); 
bulk.find({ item: null }).update({ $set: { item: "TBD" } }); 
bulk.execute(); 
0

почему-то не как

User.find({}, function(err, items){ 
    if (err){ 
    consele.log('err'); 
    consele.log(err); 
    } 
    items.forEach(function(item){ 
    var time = (Math.floor(Math.random() * (1474893715201 - 1474800000000) + 1474800000000)); 
    item.lastLogin = time; 
    User.save(item); // or item.save() based on driver you are using 
    }); 
}); 
Смежные вопросы