2013-07-15 16 views
11

sto cercando di scrivere di scrivere un aggiornamento di un documento Mongo utilizzando la funzione di Mongoose findOneAndUpdate. In sostanza, ho un documento che ha una serie di un altro schema in essa, e quando tento di aggiungere più di quelli tipo di schema, ottengo il seguente errore:Mongo/Mongoose non valido errore valore aggiornamento atomica

[Error: Invalid atomic update value for $__. Expected an object, received object] 

Sto attraversando un periodo difficile capire cosa significa questo errore, tanto meno che ne sia la fonte.

I dati che sto cercando di aggiornare è la seguente:

{ section_id: 51e427ac550dabbb0900000d, 
version_id: 7, 
last_editor_id: 51ca0c4b5b0669307000000e, 
changelog: 'Added modules via merge function.', 
committed: true, 
_id: 51e45c559b85903d0f00000a, 
__v: 0, 
modules: 
[ { orderId: 0, 
type: 'test', 
tags: [], 
data: [], 
images: [], 
content: ["Some Content Here"] }, 
{ orderId: 1, 
type: 'test', 
tags: [], 
data: [], 
images: [], 
content: ["Some Content Here"] }, 
{ orderId: 2, 
type: 'test', 
tags: [], 
data: [], 
images: [], 
content: ["Some Content Here"] }, 
{ orderId: 3, 
type: 'test', 
tags: [], 
data: [], 
images: [], 
content: ["Some Content Here"] }, 
{ orderId: 4, 
type: 'test', 
tags: [], 
data: [], 
images: [], 
content: ["Some Content Here"] }, 
{ orderId: 5, 
type: 'test', 
tags: [], 
data: [], 
images: [], 
content: ["Some Content Here"] } ] } 

L'unica differenza è che quando ho recuperare, ci sono tre meno moduli, e aggiungo alcuni nuovi alla matrice.

piacerebbe sentire ogni pensiero, almeno quanto a che cosa significa l'errore!

risposta

0

Ho avuto lo stesso problema. Ho finito per utilizzando finOne() method

creare una nuova, se non trovato, aggiornare quello esistente se trovato.

So che ci sono due operazioni. ma non ho trovato alcun modo di farlo in un solo passaggio.

12

Ciò è probabilmente dovuto al fatto che l'oggetto aggiornato è ancora un oggetto Mongoose. Provate a convertirlo in un oggetto JS prima della findOneAndUpdate

object = object.toString() 

ed eliminare qualsiasi attributo potenziale ID

delete object._id 

O semplicemente

object = object.toObject(); 
+6

È possibile utilizzare .toObject() per convertire un mongooseObject a un oggetto –

+0

quando si utilizza .toObject() lo fa rimuovere automaticamente il campo _id? – Xsmael

3

Ho avuto lo stesso problema e si è scoperto Stavo usando $ push in modo errato. Stavo facendo

{$push:thing_to_push} 

ma aveva bisogno di essere

{$push:{list_to_push_into:thing_to_push}} 
2

@Magrelo e @plus mi ha portato a una risposta che ha funzionato. Qualcosa di simile:

MyModel.findOneAndUpdate({ section_id: '51e427ac550dabbb0900000d' }, mongooseObject.toObject(), { upsert: true }, function(err, results) { 
    //... 
}); 
0

Un'altra cosa da controllare è se si sta inviando passare una serie di modifiche a $ set. Il messaggio di errore che ho ricevuto al momento della chiamata qualcosa come questo:

db.products.update({ sku: "abc123" }, 
       { $set: [ 
         {quantity: 500}, 
         {instock: true} 
         ] 
       } 
      ) 

mi ha dato la [Errore: il valore di aggiornamento atomica non valido per $ set. Previsto un oggetto, oggetto ricevuto]

Cambiarlo su un oggetto lavorato.

db.products.update({ sku: "abc123" }, 
       { $set: { 
          quantity: 500, 
          instock: true 
         } 
       } 
      ) 
1

Provare a passare il valore del parametro di aggiornamento come stringa anziché oggetto modello mangusta. Stavo ricevendo lo stesso errore quando utilizzo per passare l'oggetto del modello. Di seguito è riportata la differenza di codice.

codice che stava avendo problema:

updateUser: function(req, res) { 
**var updatedUserModel = new Users(req.body);** 
    Users.findOneAndUpdate({tpx_id:req.params.id}, {$set:**updatedUserModel**}, function(err, User){ 
      ... 
    } 
} 

codice di lavoro:

updateUser: function(req, res) { 
    Users.findOneAndUpdate({tpx_id:req.params.id}, {$set:**req.body**}, function(err, User) { 
    ... 
} 
Problemi correlati