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'
}
]
}
'$ 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
@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
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