489 votes

Comment faire mise à jour/upsert hors-ligne en mangouste ?

C'est peut-être le temps, peut-être que c'est moi la noyade dans rare documentation et de ne pas être en mesure d'envelopper ma tête autour de la notion de mise à jour de la Mangouste :)

Voici l'affaire:

J'ai un contact de schéma et modèle (raccourcissement de propriétés):

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var mongooseTypes = require("mongoose-types"),
    useTimestamps = mongooseTypes.useTimestamps;


var ContactSchema = new Schema({
    phone: { type: String, index: { unique: true, dropDups: true } },
    status: { type: String, lowercase: true, trim: true, default: 'on' }
});
ContactSchema.plugin(useTimestamps);
mongoose.model('Contact', ContactSchema); //is this line superflous??
var Contact = mongoose.model('Contact', ContactSchema);

Je reçois une demande de la part du client, contenant les champs dont j'ai besoin et utiliser mon modèle c'est:

mongoose.connect(connectionString);
var contact = new Contact({
        phone: request.phone,
        status: request.status
    });

Et maintenant, nous abordons le problème:

  1. Si je l'appelle, contact.save(function(err){...}) je vais vous recevez un message d'erreur si le contact avec le même numéro de téléphone existe déjà (comme prévu - unique)
  2. Je ne peux pas appeler de mise à jour() sur le contact, étant donné que la méthode n'existe pas sur un document
  3. Si je l'appelle de mise à jour sur le modèle:
    Contact.update({phone:request.phone}, contact, {upsert: true}, function(err{...})
    J'entre dans une boucle infinie de quelques sortes, depuis la Mangouste mise à jour de la mise en œuvre clairement ne veulent pas d'un objet en tant que second paramètre.
  4. Si je fais la même chose, mais dans le second paramètre que je passe un tableau associatif de la demande de propriétés {status: request.status, phone: request.phone ...} il fonctionne, mais je n'ai pas de référence précise au contact et ne peut pas trouver son createdAt et updatedAt propriétés.

Donc la ligne du bas, après tout, j'ai essayé: étant donné un document contact, comment puis-je le mettre à jour si elle existe, ou l'ajouter si elle ne l'est pas?

Merci pour votre temps.

546voto

Pascalius Points 1202

Mangouste cela supporte désormais nativement avec findOneAndUpdate (appelle MongoDB findAndModify).

L’upsert = option vraie crée l’objet s’il n’existe pas. la valeur par défaut false.

208voto

Clint Harris Points 7163

Je viens de graver un solide 3 heures à essayer de résoudre le même problème. Plus précisément, j’ai voulu « remplacer » l’ensemble du document, si elle existe, ou l’insérer dans le cas contraire. Voici la solution :

J’ai créé un sujet sur la page du projet mangouste demandant que les infos à ce sujet soit ajouté à la documentation.

101voto

chrixian Points 1957

Vous étiez étroite avec

mais votre deuxième paramètre doit être un objet avec un opérateur de la modification par exemple

83voto

Traveling Tech Guy Points 6975

Eh bien, j’ai attendu longtemps assez et aucune réponse. Enfin, a renoncé à l’approche de toute mise à jour/upsert et partit avec :

Cela fonctionne-t-il ? Ouais. Je suis heureux avec cela ? Probablement pas. DB 2 appels au lieu d’un.
J’espère une mise en œuvre future de la mangouste serait venu avec une `` fonction.

13voto

andres_gcarmona Points 41

J'avais besoin de mettre à jour/upsert un document dans une collection, ce que j'ai fait était de créer un nouvel objet littéral comme ceci:

notificationObject = {
    user_id: user.user_id,
    feed: {
        feed_id: feed.feed_id,
        channel_id: feed.channel_id,
        feed_title: ''
    }
};

composé à partir de données que je reçois à partir de quelque part d'autre dans ma base de données et ensuite appeler la mise à jour sur le Modèle

Notification.update(notificationObject, notificationObject, {upsert: true}, function(err, num, n){
    if(err){
        throw err;
    }
    console.log(num, n);
});

c'est la sortie que je reçois après avoir exécuté le script pour la première fois:

1 { updatedExisting: false,
    upserted: 5289267a861b659b6a00c638,
    n: 1,
    connectionId: 11,
    err: null,
    ok: 1 }

Et c'est la sortie lorsque je lance le script pour la seconde fois:

1 { updatedExisting: true, n: 1, connectionId: 18, err: null, ok: 1 }

Je suis l'aide de la mangouste version 3.6.16

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X