7
votes

Mettre à jour avec expression au lieu de la valeur

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: xxx

entraîne cependant le message d'erreur suivant:

RéférenceError: i_up n'est pas défini (Shell): 1

En même temps, la base de données n'avait aucun problème à manger celui-ci: xxx

Dois-je faire ce document à la fois ou quelque chose? Cela semble juste excessivement compliqué.

mise à jour Merci Sergio Tulentev pour me dire que cela ne fonctionne pas. Maintenant, je me débats vraiment avec comment faire ça. J'offre 500 points de profit à l'âme utile, qui peut l'écrire de manière à ce que MongoDB comprend. Si vous vous inscrivez sur Notre forum Je peux ajouter les points de profit à votre compte là-bas.


0 commentaires

5 Réponses :


5
votes

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 2 * 2 ).

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.


5 commentaires

Ne pouviez-vous pas envoyer un peu de db.questions.find (...). Foreach (fonction (q) {/ * db.questions.update (...) pour patcher 'q' in-place * /}) 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 (...) sera un curseur afin qu'il n'essaiera pas d'instancier un tableau entier pour le pour Acheach .


Essayez-vous dans la coquille? Je me demandais plus de quelle commande je devais utiliser dans le pilote (ruby).


Vous pouvez utiliser db.eval () pour envoyer JavaScript directement dans. Je l'écrirai comme une réponse plus tard ce soir, pourrait être utile pour les futures chercheurs.



6
votes

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 } }
        );
    });
})


3 commentaires

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.



0
votes

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')
            }
        }
    )
});


2 commentaires

Il suffit de mettre à jour rangée.destination et utilisez rang.save au lieu de db.call ... mettre à jour (


Je suis vraiment désolé: la syntaxe correcte est db.call.save (ligne) au lieu de la page rangée.save



3
votes

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: xxx


0 commentaires

1
votes

//the only differnce is to make it look like and aggregation pipeline
db.table.updateMany({}, [{
      $set: {
        col3:{"$sum":["$col1","$col2"]}
      },
    }]
 )


0 commentaires