2012-09-27 9 views
5

Per i amor di semplicità, assumendo questi sono i miei schemi di raccolta:Mongoose/MongoDB - Semplice esempio di aggiungendo a un array oggetto documento, con un pre-definito schema

var MessageDeliverySchema = new Schema({ 
    from : { type : String }, 
    to  : { type : String }, 
    status : { type : String } 
}); 

var Messages = mongoose.model('messages', 
new Schema({ 
    id    : ObjectId, 
    user   : { type:String }, 
    'sent-messages' : [MessageDeliverySchema] 
})); 

Così ogni documento nella collezione I messaggi possono avere 4/5 messaggi inviati definiti da MessageDeliverySchema.

Quello che voglio fare è di avere una serie di inviati-messaggi, così ogni volta una ricevuta di consegna è disponibile in Ho appena aggiorno Messaggi e aggiungere un altro messaggio inviato.

Quello che ho provato:

var delivered = { 
from: 'foo', 
to: 'bar', 
status: 'delivered' 
}; 

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$pushAll: { 'sent-messages' : delivered }} , {upsert:true}, function(err, data) { 

}); 

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$push: { 'sent-messages' : delivered }},{upsert:true}, function(err, data) { 
}); 

$ pushAll, e $ spinta, non aggiunge un nuovo oggetto per inviati-messaggi, invece sovrascrive un messaggio esistente.

Quello che voglio vedere è una serie di messaggi inviati per esempio:

{ 
    'sent-messages': [ 
     { 
      from: 'foo', 
      to: 'bar', 
      status: 'delivered' 
     }, 
     { 
      from: 'pippo', 
      to: 'pippo', 
      status: 'delivered' 
     }, 
     { 
      from: 'paul', 
      to: 'smith', 
      status: 'undelivered' 
     } 
    ] 
} 
+0

'$ push' è l'operatore diritto di utilizzare e il codice ha funzionato bene quando l'ho provato . Ogni volta che l'ho eseguito, è stato aggiunto un nuovo elemento di matrice 'inviati-messaggi'. – JohnnyHK

+0

@JohnnyHK Ah, OK, quindi non stava sovrascrivendo il messaggio esistente. Sto ottenendo l'errore: 'Non posso applicare $ push/$ pushAll modificatore a non-array'. – StuR

+1

Significa che la proprietà 'inviati-messaggi' in quel documento che è già nel database non è una matrice, quindi non può essere inviata a. Forse hai aggiunto quel documento con altri mezzi in modo che non corrisponda al tuo schema Mongoose. – JohnnyHK

risposta

9

L'errore mi è stato sempre stato: 'Impossibile applicare $ push/$ pushAll modificatore non-array'.

ho aggiunto un oggetto al documento come questo:

Message.update({_id: '5064aae4154cb34d14000001' }, 
      { 'sent-messages' : delivered }, function(err, data) { 
    }); 

E poi ha cercato di fare un $ spinta, che mi ha dato l'errore precedente.

Quindi ho rimosso il documento e utilizzato $ push che ha avuto l'effetto desiderato.

Per riferimento questo è il modo corretto per aggiungere a un documento esistente, e la risposta alla mia domanda:

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$push: { 'sent-messages' : delivered }},{upsert:true}, function(err, data) { 
});