web-dev-qa-db-fra.com

Retourner la collection mise à jour avec Mongoose

Je travaille avec nodejs/express/mongoose/angularjs. Je voudrais mettre à jour une collection nommée Lists qui possède plusieurs propriétés, dont l'une est un tableau d'éléments. Dans le code suivant, je pousse un nouvel élément de tâche dans le tableau des éléments. Tout fonctionne bien, mais la fonction de mise à jour ne renvoie pas la collection mise à jour, alors je dois effectuer une autre requête sur la base de données. Existe-t-il un moyen plus efficace de procéder?

Le nodejs/code express:

exports.addTaskToList = function(req, res) {
    var listId = req.params.Id;
    var taskId = req.params.TaskId;
    Lists.update({_id: listId}, {$Push: {items: taskId}}, {safe:true, upsert: true}, function(err, result){
        if(err) {
            console.log('Error updating todo list. ' + err);
        }
        else{
            console.log(result + ' todo list entry updated - New task added');
            Lists.findById(listId).populate('items').exec(function (err, updatedEntry) {
                if (err) {
                    console.log('Unable to retrieve todo list entry.');
                }
                res.send(JSON.stringify(updatedEntry));
            });
        }           
    });
};

De plus, les éléments du tableau sont un tableau d'ObjectIds. Ces éléments sont dans un schéma distinct, donc dans une collection distincte. Est-il possible de pousser l'objet entier et pas seulement son _id pour qu'il n'y ait pas d'autre collection créée?

26
GuillaumeA

méthode de mise à jour ne renvoie pas le document mis à jour:

Cependant, si nous n'avons pas besoin que le document soit renvoyé dans notre application et que nous voulons simplement mettre à jour une propriété dans la base de données directement, la mise à jour du modèle # nous convient.

Si vous devez mettre à jour et renvoyer le document, veuillez considérer l'une des options suivantes:

Approche traditionnelle:

Lists.findById(listId, function(err, list) {
    if (err) {
        ...
    } else {
        list.items.Push(taskId)
        list.save(function(err, list) {
            ...
        });
    }
});

Approche plus courte:

Lists.findByIdAndUpdate(listId, {$Push: {items: taskId}}, function(err, list) {
    ...
});
26
Mattias Eriksson

utilisez la méthode findOneAndUpdate () et dans les paramètres de requête, utilisez l'option {"new": true}

return this.sessionModel
       .findOneAndUpdate({user_id: data.user_id}, {$set:{session_id: suuid}}, { "new": true})
       .exec()
       .then(data=>{
        return {
          sid: data.session_id
            }
        })
20
KARTHIKEYAN.A

Concernant votre dernière question:

Est-il possible de pousser l'objet entier et pas seulement son _id pour qu'il n'y ait pas d'autre collection créée?

La réponse est oui. Vous pouvez stocker des sous-documents dans des documents assez facilement avec Mongoose ( documentation sur les sous-documents ici ). En modifiant un peu votre schéma, vous pouvez simplement pousser l'ensemble de votre objet (pas seulement l'élément _id) dans un tableau d'éléments définis dans votre schéma de liste. Mais vous devrez modifier votre schéma, par exemple:

var itemSchema = new Schema({ 
    // Your Item schema goes here
    task: 'string'       // For example
});

var listSchema = new Schema({
    // Your list schema goes here
    listName: String,    // For example...
    items: [itemSchema]  // Finally include an array of items
});

En ajoutant un objet item à la propriété items d'une liste, puis en enregistrant cette liste - votre nouvel élément sera conservé dans la collection List. Par exemple,

var list = new List({
    listName: "Things to do"
});

list.items.Push({
    task: "Mow the lawn"
});

list.save(function(error, result) {
    if (error) // Handle error
    console.log(result.list) // Will contain your item instance
});

Ainsi, lorsque vous chargez votre liste, la propriété items sera pré-remplie avec votre tableau d'éléments.

Cela est dû au fait que les éléments ne persisteront plus dans une collection distincte. Il sera conservé dans la collection List en tant que sous-document d'une liste.

1
C Blanchard