N'étant pas un gars Javascript particulièrement fort, j'ai du mal à essayer de mettre à jour beaucoup d'objets Date
dans Mongo.
Il semble que $inc
n'a pas encore été implémenté pour les objets Date
. Donc, pour essayer de frapper un tas de dates par un jour, j'ai appelé (quelque chose comme) ce script de bash via mongo myScript.js
:
conn = new Mongo(); db = conn.getDB('myDatabase'); var incrementDates = function() { db.blah.find(myQuery).forEach(function(doc) { db.blah.update( { _id : doc._id , my_date : { $exists : true } } , { $set : { my_date : new Date(doc.my_date.getTime() + 86400000) }} ); }); } incrementDates();
L'idée de base semble fonctionner assez bien dans la coque mongoDB:
> var doc = db.blah.findOne(myQuery) > doc.my_date ISODate("1962-11-02T23:00:00Z") > new Date(doc.my_date.getTime() + 86400000); ISODate("1962-11-03T23:00:00Z")
Mais pas très bien dans le script:
TypeError: doc.my_date has no properties
Je getTime
donc que j'essaie d'appeler getTime
sur null
part, même si la requête dans ma mise à jour ne doit retourner que les documents où my_date
existe.
Des idées sur ce qui se passe ici? Plus important encore: existe-t-il une meilleure façon de le faire?
Le problème est que ma requête $exists
est (évidemment, à la deuxième apparence) au mauvais endroit. Les documents ont été renvoyés, sans doute, n'incluent pas my_date
.
Voici la fonction corrigée, qui fonctionne comme prévu.
var incrementDates = function() { db.blah.find({ ... , my_date : { $exists : true } ).forEach(function(doc) { db.blah.update( { _id : doc._id } , { $set : { my_date : new Date(doc.my_date.getTime() + 86400000) }} ); }); }