MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak zwrócić poddokumenty z obiektu w tablicy z Meteor i MongoDB?

! 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:

  1. Jeśli na początku meteor zawiedzie, wypróbuj konsolę mongo...
  2. 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.
  3. 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:

  1. Dużo nauczyłem się z częstych błędów napisany przez @David Weldon
  2. dokumentacja dla aldeed:collection2
  3. dokumentacja dla aldeed:simple-schema
  4. 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.
  5. Przegląd dokumentacji na temat aktualizacji z MongoDB
  6. Dokumentacja MongoDB $addToSet
  7. Dokumentacja MongoDB $push
  8. [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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. jak dodać nowe pola do schematu solr

  2. MongoDB - różni się od zapytania nie używa indeksów

  3. Czy w Mongo można dostać kawałek plasterka?

  4. MongoDB C# driver 2.0:jak uzyskać wynik z MapReduceAsync

  5. Wstawianie nowych pól (kolumn) do mongoDB za pomocą pand