Je suis totalement nouveau à mongodb ... il me manque une balise "débutant". Les experts n'auraient donc pas à voir cette question.
J'essaie de mettre à jour tous les documents d'une collection à l'aide d'une expression. La requête que je m'attendais à résoudre c'était: p> entraîne cependant le message d'erreur suivant: P> RéférenceError: i_up n'est pas défini (Shell): 1 P>
blockquote> En même temps, la base de données n'avait aucun problème à manger celui-ci: p> Dois-je faire ce document à la fois ou quelque chose? Cela semble juste excessivement compliqué. P>
5 Réponses :
Vous ne pouvez pas utiliser les expressions dans les mises à jour. Ou plutôt, vous ne pouvez pas utiliser des expressions qui dépendent des champs du document. Les expressions mathématiques simples auto-contenant sont bien (par exemple Si vous souhaitez définir un nouveau champ pour tous les documents fonctionnant d'autres champs, vous devez en faire la boucle et mettre à jour manuellement. Multi-Mise à jour ne vous aidera pas ici. P> 2 * 2 code>). P>
Ne pouviez-vous pas envoyer un peu de db.questions.find (...). Foreach (fonction (q) {/ * db.questions.update (...) pour patcher 'q' in-place * /}) code> JavaScript dans MongoDB pour éviter de quitter la base de données? J'ai fait des choses similaires pour éviter les trébuches rondes de la base de données.
@Muistooshort: théoriquement, vous pourriez. Je ne l'ai pas fait moi-même.
Je viens de faire quelques tests et cela semble fonctionner, The Docs Même suggérer que db.questions.find (...) code> sera un curseur afin qu'il n'essaiera pas d'instancier un tableau entier pour le
pour Acheach code>.
Essayez-vous dans la coquille? Je me demandais plus de quelle commande je devais utiliser dans le pilote (ruby).
Vous pouvez utiliser db.eval () code> pour envoyer JavaScript directement dans. Je l'écrirai comme une réponse plus tard ce soir, pourrait être utile pour les futures chercheurs.
Je viens de trouver cela lors de la recherche de l'équivalent de MongoDB de SQL comme ceci:
connection.eval(%q{ db.QUESTIONS.find({}, {_id: true, i_up: true, i_down: true}).forEach(function(q) { db.QUESTIONS.update( { _id: q._id }, { $set: { i_pp: q.i_up * 100 - q.i_down * 20 } } ); }); })
Eval est obsolète, quel est le remplacement ou la variante? Il suffit de l'exécuter directement, sans eval? At-il les mêmes effets?
@Captainobvious: je n'utilise plus mongodb, donc je ne suis pas sûr. Cette autre réponse aide?
Malheureusement non. docs.mongodb.com/v3.2/reference/command stipule que eval est également obsolète. Merci pour l'effort cependant, je vais essayer de le comprendre.
Exemple Pour supprimer "00" du début d'un identifiant de l'appelant:
db.call_detail_records_201312.find( { destination: /^001/ }, { "destination": true } ).forEach(function(row){ db.call_detail_records_201312.update( { _id: row["_id"] }, { $set: { destination: row["destination"].replace(/^001/, '1') } } ) });
Il suffit de mettre à jour rangée.destination code> et utilisez
rang.save code> au lieu de
db.call ... mettre à jour ( code>
Je suis vraiment désolé: la syntaxe correcte est db.call.save (ligne) code> au lieu de la page
rangée.save code>
RHA7 a donné une bonne idée, mais le code ci-dessus ne fonctionne pas sans définir une variable temporaire.
Ce code d'échantillon produit un calcul approximatif de l'âge (années de saut derrière la scène) basé sur le champ "Anniversaire" et les insertions La valeur dans le champ approprié pour tous les documents ne contenant pas de telle: p>
//the only differnce is to make it look like and aggregation pipeline db.table.updateMany({}, [{ $set: { col3:{"$sum":["$col1","$col2"]} }, }] )