Как обновить поле даты в консоли mongo?
Например, я хочу обновить все записи до '2012-01-01' ( "время": ISODate ( "2011-12-31T13: 52: 40Z" )).
db.test.update( { time : '2012-01-01' }, false, true )
Ошибка возврата:
Assert failed : need an object
Error("Printing Stack Trace")@:0
()@shell/utils.js:35
("assert failed : need an object")@shell/utils.js:46
(false,"need an object")@shell/utils.js:54
([object Object],false,true)@shell/collection.js:189
@(shell):1
Wed Jan 11 17:52:35 uncaught exception: assert failed : need an object
Ответы
Ответ 1
Вам нужно создать новый объект ISODate
, например:
db.test.insert({"Time" : new ISODate("2012-01-10") });
Это верно как для обновлений, так и для запросов. Обратите внимание, что ваш синтаксис запроса неверен, он должен быть
db.test.update({ criteria }, { newObj }, upsert, multi);
Например, чтобы обновить все объекты, рассмотрите
db.test.update( {}, { $set : { "time" : new ISODate("2012-01-11T03:34:54Z") } }, true, true);
Также обратите внимание, что это сильно отличается от
db.test.update( {}, { "time" : new ISODate("2012-01-11T03:34:54Z") }, true, false);
потому что последний будет заменить объект, а не добавлять новое поле в существующий документ или обновлять существующее поле. В этом примере я изменил последний параметр на false
, потому что несколько обновлений работают только с операторами $
.
Ответ 2
Если вам нужно преобразовать существующее поле даты (импортированное из формата MySQL "yyyy-mm-dd" f.e.) в ISODate, вы можете пропустить эти документы так:
/usr/bin/mongo yourdbname --eval "db.yourcollectionname.find().forEach(function(doc){doc.yourdatefield = new ISODate(doc.yourdatefield);db.yourcollectionname.save(doc)});"
Ответ 3
Вы можете сделать это в старой школе, создав дату ISO
db.test.update({_id : 1}, {
$set : {
"time" : new ISODate("your current date")
}
});
Но обратите внимание, что с новым Mongo 2.6
вы сможете легко обновить дату до текущей даты с помощью $currentDate.
db.test.update( { _id: 1 }, {
$currentDate: {
time: true,
},
})