2013-03-25 10 views
47

mam tego schematu Mongooseprzesuwając obiekt w schemacie tablicy w Mongoose

var mongoose = require('mongoose'); 

var ContactSchema = module.exports = new mongoose.Schema({ 
    name: { 
    type: String, 
    required: true 
    }, 
    phone: { 
    type: Number, 
    required: true, 
    index: {unique: true} 
    }, 
    messages: [ 
    { 
    title: {type: String, required: true}, 
    msg: {type: String, required: true} 
    }] 
}, { 
    collection: 'contacts', 
    safe: true 
}); 

i próby aktualizacji modelu w ten sposób:

Contact.findById(id, function(err, info) { 
    if (err) return res.send("contact create error: " + err); 

    // add the message to the contacts messages 
    Contact.update({_id: info._id}, {$push: {"messages": {title: title, msg: msg}}}, function(err, numAffected, rawResponse) { 
     if (err) return res.send("contact addMsg error: " + err); 
     console.log('The number of updated documents was %d', numAffected); 
     console.log('The raw response from Mongo was ', rawResponse); 

    }); 
    }); 

jestem ja nie uznająca messages wziąć tablica obiektów?
BŁĄD: MongoError: Nie można stosować $ Push/$ pushAll modyfikator do braku tablicy

Jakieś pomysły?

+0

Jaki komunikat błędu otrzymujesz? Co masz na myśli, mówiąc: "Nie wydaje mi się, żeby" pchnięcie w dół "zostało wykonane właściwie? – shelman

+0

MongoError: Nie można zastosować modyfikatora $ push/$ pushAll do tablicy innej niż – user1460015

+1

Nie wiem, czy to rozwiąże problem, ale spróbuj odjąć nawiasy kwadratowe od '[{title: title, msgs: [msg]}]'. '$ push' przyjmuje jedną wartość. – shelman

Odpowiedz

104

mangusta robi to za Ciebie podczas jednej operacji.

Contact.findByIdAndUpdate(
    info._id, 
    {$push: {"messages": {title: title, msg: msg}}}, 
    {safe: true, upsert: true}, 
    function(err, model) { 
     console.log(err); 
    } 
); 

Należy pamiętać, że za pomocą tej metody nie będzie można korzystać z funkcji "wstępnych" schematu.

http://mongoosejs.com/docs/middleware.html

W najnowszej findbyidandupdate mogoose musi mieć "nowe: true" opcjonalne param dodaje do niego. W przeciwnym razie otrzymasz stary dokument zwrócony do Ciebie. W związku z tym aktualizacja dla wersji Mongoose 4.x.x jest konwertowana na:

Contact.findByIdAndUpdate(
     info._id, 
     {$push: {"messages": {title: title, msg: msg}}}, 
     {safe: true, upsert: true, new : true}, 
     function(err, model) { 
      console.log(err); 
     } 
    ); 
+3

Dlaczego 'upsert' tutaj? –

+0

@TejasManohar to tylko po to, aby pokazać, że można włączyć wiele opcji. – fino

+3

ta odpowiedź bardzo mi pomogła. Ale co z tymi opcjami, 'safe',' upsert' i 'new'? – CodyBugstein

Powiązane problemy