2011-09-08 2 views
1

De la documentation que j'ai lu que vous pouvez faire ceci:Puis-je définir une valeur MongoDB pour une expression javascript?

db.people.update({ name:"Joe" }, { $set: { n : 1 } }); 

(http://www.mongodb.org/display/DOCS/Updating)

Maintenant, je voudrais le mettre à une valeur dynamique comme un compteur ou une expression:

var i = 0; 
db.people.update({ name:"Joe" }, { $set: { n : $i++ } }); 

db.people.update({ name:"Joe" }, { $set: { n : ${new Date()} } }); 

Est-ce possible ?

J'accepte également toute solution qui n'a pas besoin de modifier et de sauvegarder le document entier.

+0

Savez-vous ce que '$ inc' fait? les exemples que vous avez donnés ne font pas grand-chose/aucun sens –

+0

Désolé, je mets en place. Je corrige mon erreur, merci! –

Répondre

1

mongo est un shell javascript étendu avec le soutien de MongoDB, de sorte que vous pouvez faire tout ce que vous pouvez faire avec javascript simple:

var i = 0; 
db.people.update({ name:"Joe" }, { $set: { n : i++ } }); 

et

db.people.update({ name:"Joe" }, { $set: { n : new Date() } }); 

Mise à jour

ah donc .. ça ne va pas marcher. Vous devez mettre à jour chaque document individuellement! JS est exécuté avant de transmettre cette requête à la base de données. Effectly que vous faites ce qui suit:

db.foo.update({}, { $set: { n : 0 } }, false, true); # i was zero here 
i++; 

Comme je l'ai dit, vous devez mettre à jour chaque document individuellement, mais vous pouvez exécuter le tout sur côté serveur avec db.eval() pour accélérer les choses un peu;)

+0

J'ai essayé votre suggestion mais il semble que i ++ ne soit évalué qu'une fois donc tous les documents ont la même valeur (1). Je suppose que c'est logique. Mais je cherche toujours un moyen d'assigner une expression qui est évaluée à chaque fois. –

+0

non, il est évalué à chaque fois. vous faites quelque chose de mal, montrez le code. Peut-être que vous stockez le résultat (l'objet) et espérez qu'il va à nouveau évaluer? –

+0

Je l'ai essayé à nouveau, voir la nouvelle réponse (je ne pouvais pas l'obtenir pour formater correctement comme un commentaire ...) –

Questions connexes