2012-09-27 9 views
5

Przez wzgląd na prostotę, zakładając, że są to moje schematy kolekcja:Mongoose/MongoDB - Prosty przykład dodanie do tablicy obiektów dokument, o zdefiniowanym schemacie

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] 
})); 

Więc każdy dokument w kolekcji Wiadomości może mieć 4/5 wysłanych wiadomości zdefiniowanych przez MessageDeliverySchema.

Co chcę zrobić, to mieć tablicę Wysłane wiadomości, więc za każdym razem pokwitowanie dostawy przychodzi po prostu zaktualizować Wiadomości i dołączyć kolejny wysłana wiadomość.

Co próbowałem:

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 i $ Push, nie dołączy nowy obiekt do Wysłane wiadomości zamiast nadpisuje istniejący komunikat.

Co chcę zobaczyć, jest tablicą wysłanych wiadomości np:

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

'$ push' jest prawo do korzystania z operatorem i kod pracował dobrze, gdy próbowałem go . Za każdym razem, gdy go uruchamiałem, dodano nowy element tablicy 'sent-messages'. – JohnnyHK

+0

@JohnnyHK Ah, OK, więc nie zastąpiło istniejącej wiadomości. Otrzymuję błąd: "Nie można zastosować modyfikatora $ push/$ pushAll do nie tablicy". – StuR

+1

Oznacza to, że właściwość 'sent-messages' w tym dokumencie, która znajduje się już w bazie danych, nie jest tablicą, więc nie można jej przekazać. Być może dodałeś ten dokument w inny sposób, więc nie pasuje on do twojego schematu Mongoose. – JohnnyHK

Odpowiedz

9

Błąd I był już było: „Nie można zastosować impuls $/$ pushAll modyfikator do braku tablicy”.

Dodałem obiektu do dokumentu tak:

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

a następnie próbował zrobić $ impuls, który dał mi powyższy błąd.

Usunąłem dokument i użyłem $ push, który przyniósł pożądany efekt.

Dla porównania jest to poprawny sposób, aby dołączyć do istniejącego dokumentu, a odpowiedź na moje pytanie:

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