2011-11-03 22 views
10

Mam problem z osadzoną aktualizacją dokumentu.Dokumentacja wbudowanego mongoose

Moi zdefiniowane schematy:

var Talk = new Schema({ 
    title: { 
     type: String, 
     required: true 
    }, 
    content: { 
     type: String, 
     required: true 
    }, 
    date: { 
     type: Date, 
     required: true 
    }, 
    comments: { 
     type: [Comments], 
     required: false 
    }, 
    vote: { 
     type: [VoteOptions], 
     required: false 
    }, 
}); 

var VoteOptions = new Schema({ 
    option: { 
     type: String, 
     required: true 
    }, 
    count: { 
     type: Number, 
     required: false 
    } 
}); 

Teraz chciałbym zaktualizować vote.count++ z danym Talk id i VoteOption id. Mam następującą funkcję aby wykonać zadanie:

function makeVote(req, res) { 

    Talk.findOne(req.params.id, function(err, talk) { 
     for (var i = 0; i < talk.vote.length; i++) { 
      if (talk.vote[i]._id == req.body.vote) { 
       talk.vote[i].count++; 

      } 
     } 
     talk.save(function(err) { 
      if (err) { 
       req.flash('error', 'Error: ' + err); 
       res.send('false'); 
      } else { 
       res.send('true'); 
      } 
     }); 
    }); 
} 

Wszystko wykonuje, ja odzyskać res.send('true'), ale wartość na zliczania nie zmienia.

Kiedy zrobiłem trochę console.log zobaczyłem, że zmieniło wartość, ale talk.save po prostu nie zapisuje go w db.

Również jestem niezadowolony z cyklu, aby znaleźć _id zagnieżdżonego dokumentu. W dokumentacji mongoose czytałem o talk.vote.id(my_id) ale to daje mi błąd braku funkcji id.

Odpowiedz

19

Podczas aktualizacji typu Mixed (który wydaje się być czymkolwiek innym niż typem podstawowym, a więc zawiera również dokumenty osadzone), należy zadzwonić pod numer .markModified w dokumencie. W takim przypadku będzie to:

talk.markModified("vote"); // mention that `talk.vote` has been modified 

talk.save(function(err) { 
    // ... 
}); 

Mam nadzieję, że to pomoże komuś w przyszłości, ponieważ nie mogłem znaleźć odpowiedzi bardzo szybko.


Reference:

... Mongoose traci zdolność do Auto Detect/zapisać te zmiany. Aby "powiedzieć" Mongoose, że zmieniła się wartość typu Mieszanego, należy wywołać metodę .markModified(path) dokumentu przekazującego ścieżkę do właśnie zmienionego typu Mieszany.

+0

Bohater dnia! – MrBr

0

Dzieje się tak, ponieważ próbujesz zapisać swój obiekt rozmowy przed wywołaniem zwrotnym, którego liczba incydentów została uruchomiona. Czy upewniłeś się, że utworzysz swój schemat Talk? np:

var talk = new Talk(); 

Jednakże, jeśli wszystko, co chcesz zrobić, to przyrost zmienna count, Mongo obsługuje Atomowej aktualizacje w miejscu, które mogą okazać się przydatne:

talk.find({ _id : req.body.vote }, { $inc: { count : 1 } }); 

rzucić okiem na: http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc