! ROZWIĄZANE!
Problem polega na tym, że nie wiedziałem, co pakiet aldeed:collection2 robił z moim kodem. Dodałem ten pakiet, aby używać OrionJS (tutaj jest strona github ). I nie zauważyłem, że ten aldeed:collection2 wymuszał walidację wszystkich moich aktualizacji. Wpadałem na to wcześniej, ale powodowało to błąd. W przeszłości udało mi się prześledzić błąd. Tym razem nie wystąpił błąd gdziekolwiek. Zaktualizuje tablicę, ale z pustym obiektem. Takie mylące. Zamierzam opublikować problem na aldeed:collection2 strona projektu .
Z dokumentacji projektu :"[aldeed:collection2 to] pakiet Meteor, który pozwala na dołączenie schematu do Mongo.Collection. Automatycznie sprawdza zgodność z tym schematem podczas wstawiania i aktualizacji z kodu klienta lub serwera."
dokumentacja do korekty można znaleźć tu .
Rozwiązanie:
Ponieważ używam aldeed:simple-schema i aldeed:collection2 Muszę się upewnić, że do mojej kolekcji dołączony jest odpowiedni „schemat”.
Tak jak:
Ideas.attachSchema(new SimpleSchema({
// ... a bunch of other schema data
// I was missing this:
score: {
type: [Object],
optional: true,
label: 'Score',
},
"score.$.userId": {
type: String,
optional: true,
label: 'Score'
},
"score.$.score": {
type: String,
optional: true,
label: 'Score'
}
// ... a bunch more schema data
});
Rozwiązywanie problemów:
Jak to rozgryzłem?
Cóż, jestem nowy w MongoDB - więc niechętnie szedłem do konsoli i po prostu próbowałem zrobić aktualizację stamtąd. W rzeczywistości nie przyszło mi to nawet do głowy, dopóki nie rozmawiałem z moją żoną.
Próbowałem wszystkiego, dodając cytaty wokół wszystkiego , patrząc na kod innych osób. Sprawdziłem całą doskonałą dokumentację MongoDB. Oglądałem filmy na youtube. Spojrzałem na inne rozwiązania stackoverflow.com. W końcu przyszło mi do głowy, że kod wszystkich innych wygląda dokładnie tak samo jak mój i to powinno po prostu DZIAŁAĆ. Zarejestrowałem się nawet na Clarity.fm zadać pytanie Sacha Greif za 1 USD za minutę.
... Zacząłem myśleć, że moja baza danych mongo nie działa. Może moje mongo instalacja została uszkodzona?
No dobra, jest na to test... Po dwóch dniach tych tortur w końcu do mnie dotarło - po prostu wypróbuj aktualizację w konsoli mongo... (duh)
meteor:PRIMARY> db.ideas.update({_id:"DqEGjK3xSTBdpEgXa"}, {$addToSet: {score: {userId: "123456", score: 1}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
meteor:PRIMARY> db.ideas.find()
{
"_id" : "DqEGjK3xSTBdpEgXa",
"title" : "Revive Randolf With Bloodmagic",
"body" : "Bring Randolf back from the dead using witche's bloodmagic.",
"userId" : "Rz28ByKYM4Y8futFb",
"author" : "Iryna Iglehart",
"episodeId" : "iQaxyLPi5iaYtQngf",
"timestamp" : ISODate("2016-06-08T17:37:57.237Z"),
"score" : [
{
"userId" : "123456",
"score" : 1
}
],
"overallScore" : 0,
"votedOnBy" : [ ],
"timesVotedOn" : 0
}
Kiedy już wiedziałem, że mongo MOŻE zrobić moją aktualizację - wiedziałem problem musiał leżeć w moim zestawie meteorów. Do tej pory znalazłbym problem z meteorem, gdyby to był problem. Przeszukałem każdy ciemny zakątek Google, próbując to rozgryźć.
Nie minęło dużo czasu, zanim przypomniałem sobie, że mam dziwne problemy z walidacją przed. Tyle że te problemy z walidacją zawsze pojawiały się z błędem. Fakt, że nie było błędu, a tablica została po prostu zaktualizowana pustymi obiektami, naprawdę wprawił mnie w pętlę.
Czego się nauczyłem:
- Jeśli na początku meteor zawiedzie, wypróbuj konsolę mongo...
- Zgodnie z @David Weldon komentarz - kolejna dobra technika debugowania, która pomogłaby mi, a którą mogłem wypróbować dawno temu, to uruchomić nowy projekt meteor i przetestować tam mój kod, a następnie dodawać pakiety pojedynczo i sprawdzać, kiedy każdy z nich łamie kod. Ten test wskazałby, że zasadniczo kod był poprawny i potrzebował tylko załączonego schematu z powodu dodanego pakietu.
- Nie dodawaj na ślepo pakietów. Dowiedz się, czy/kiedy pakiety zmieniają przepływ rozwoju, na przykład aldeed:collection2
Dziękuję:
WIELKIE PODZIĘKOWANIA dla @Michel Floyd i @David Weldon za wszelką pomoc w rozwiązaniu tego problemu.
Ważne linki:
- Dużo nauczyłem się z częstych błędów napisany przez @David Weldon
- dokumentacja dla aldeed:collection2
- dokumentacja dla aldeed:simple-schema
- Wyszukaj „Znajdowanie danych” w tym samouczku o meteorach - mówi o fetch() i o tym, jak jest pomocny. Pomogło mi to podczas rozwiązywania tego problemu.
- Przegląd dokumentacji na temat aktualizacji z MongoDB
- Dokumentacja MongoDB $addToSet
- Dokumentacja MongoDB $push
- [Zbiór przykładów MongoDB Bios](https://docs .mongodb.com/manual/reference/bios-example-collection/] - Dopiero po obejrzeniu takich dokumentów naprawdę zrozumiałem, że nie ma nic złego w projekcie mojej bazy danych, POWINNO być na to cały czas (i jest, oczywiście)
Powiązane pytanie:
[Rozwiązany] Jak zaktualizować tablicę poddokumentów w kolekcji MongoDB w MeteorJS