2014-07-14 17 views
12

Desidero ottenere i documenti aggiornati. Questo è il mio codice originale e si aggiorna con successo ma non restituisce il documento.Documento di aggiornamento e restituzione in Mongodb

collection.update({ "code": req.body.code },{$set: req.body.updatedFields}, function(err, results) { 
         res.send({error: err, affected: results}); 
         db.close(); 
        }); 

ho usato la funzione toArray, ma questo errore ha dato "Impossibile utilizzare un writeConcern senza un callback fornito":

collection.update({ "code": req.body.code },{$set: req.body.updatedFields}).toArray(function(err, results) { 
        res.send({error: err, affected: results}); 
        db.close(); 
       }); 

Tutte le idee?

risposta

16

collection.update() segnalerà solo il numero di documenti interessati dal proprio callback.

Per recuperare i documenti durante la modifica, è possibile utilizzare invece collection.findOneAndUpdate() (precedentemente .findAndModify()).

collection.findOneAndUpdate(
    { "code": req.body.code }, 
    { $set: req.body.updatedFields }, 
    { new: true }, 
    function (err, documents) { 
     res.send({ error: err, affected: documents }); 
     db.close(); 
    } 
); 

Nota che modificherà tutti i documenti corrispondenti in cui .update() aspetta multi: true a fare lo stesso.

Nota: attualmente si riferisce al driver Node.js a partire da version 2.2. Per le versioni future, controllare gli avvisi di ritiro all'interno della documentazione e utilizzare invece le alternative consigliate.

+5

I documenti suggeriscono che fa solo un documento, non più - –

+2

è deprecato ora. usa invece 'collection.findOneAndUpdate'! –

+1

findOneAndUpdate sembra recuperare il documento allo stato in cui si trova prima di essere modificato. Penso che la domanda fosse mirata a ottenere l'oggetto risultato – nohorbee

1

Acquista l'oggetto WriteResult:

http://docs.mongodb.org/manual/reference/method/db.collection.update/#writeresults-update

WriteResult result = collection.update({ "code": req.body.code },{$set: req.body.updatedFields}, function(err, results) { 
        res.send({error: err, affected: results}); 
        db.close(); 
       }); 

risultato dovrebbe avere qualcosa di simile:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 

Se si desidera che i risultati aggiornati, fare un altro query con la chiave primaria.

+0

questo dà solo le statistiche, non i documenti aggiornati – mido

1

Impossibile trovare un modo per aggiornare molti e restituire i record modificati in docs, così ho fatto una soluzione alternativa.

almeno un'anomalia che posso trovare con di seguito il metodo è, non sarebbe in grado di dire se il documento viene modificato o già avuto il valore che si sta utilizzando:

function findAndUpdateMany(filter, updateOptions) { 
    return collection.find(filter).project({_id: 1}).toArray() 
    .then(function(matchingIds) { 
     filter = {_id: {$in: matchingIds}} 
     return collection.updateMany(filter, updateOptions) 
    }).then(function() { 
     return collection.find(filter).toArray() 
    }) 
} 
Problemi correlati