2012-09-27 8 views
5

Für die sakes der Einfachheit, vorausgesetzt, diese sind meine Sammlung schemas:Mongoose/MongoDB - einfaches Beispiel zu einem Dokument-Objekt-Array anhängt, mit einem vordefinierten 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] 
})); 

So ist jedes Dokument in der Sammlung Nachrichten möglicherweise 4/5 send-Nachrichten durch das MessageDeliverySchema definiert.

Was ich tun möchte, ist haben eine Reihe von Gesendete Nachrichten, so dass jedes Mal, wenn eine Übermittlungsbestätigung kommt in I Nachrichten aktualisieren gerade und fügen Sie eine weitere Nachricht gesendet.

Was ich versucht habe:

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 und $ Push, hängen Sie nicht ein neues Objekt zu gesendet-Nachrichten, sondern es überschreibt eine vorhandene Nachricht.

Was ich sehe, ist eine Reihe von gesendeten Nachrichten beispiel:

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

'$ push' ist die richtige Operator fein zu verwenden und Ihr Code funktioniert, wenn ich es versuchte, . Jedes Mal, wenn ich es ausführte, wurde ein neues Arrayelement "sent-messages" hinzugefügt. – JohnnyHK

+0

@JohnnyHK Ah, OK, also wurde die vorhandene Nachricht nicht überschrieben. Ich erhalte den Fehler: '$ push/$ pushAll-Modifizierer kann nicht auf Array angewendet werden'. – StuR

+1

Das bedeutet, dass die Eigenschaft 'send-messages' in diesem Dokument, die sich bereits in der Datenbank befindet, kein Array ist und daher nicht an sie gesendet werden kann. Vielleicht haben Sie das Dokument auf andere Weise hinzugefügt, damit es nicht mit Ihrem Mongoose-Schema übereinstimmt. – JohnnyHK

Antwort

9

Der Fehler war ich war immer: 'Kann nicht $ Push/$ pushAll Modifikator auf Nicht-Array-Anwendung.'

Ich habe ein Objekt in das Dokument wie folgt aus:

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

Und dann versucht, einen $ Push zu tun, was mich den obigen Fehler gab.

Also habe ich das Dokument entfernt und $ push verwendet, was den gewünschten Effekt hatte.

Als Referenz ist dies der richtige Weg, um ein vorhandenes Dokument, und die Antwort auf meine Frage anfügen:

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