sql >> Database teknologi >  >> NoSQL >> MongoDB

Sådan returneres underdokumenter fra et objekt i et array med Meteor og MongoDB

!LØST!

Problemet her er, at jeg ikke var klar over, hvad pakken aldeed:collection2 gjorde ved min kode. Jeg tilføjede denne pakke for at bruge OrionJS (her er github-siden ). Og jeg lagde ikke mærke til, at denne aldeed:collection2 tvang validering af alle mine opdateringer. Jeg løb ind i dette før, men det gav mig en fejl. Tidligere var jeg i stand til at spore fejlen ned. Denne gang var der ingen fejl overalt. Det ville opdatere arrayet, men med et tomt objekt. Så forvirrende. Jeg vil poste et problem på aldeed:collection2 s projektside.

Fra projektdokumentationen :"[aldeed:collection2 er en] Meteor-pakke, der giver dig mulighed for at vedhæfte et skema til en Mongo.Collection. Validerer automatisk i forhold til dette skema ved indsættelse og opdatering fra klient- eller serverkode."

dokumentationen for rettelsen kan findes her .

Løsning:

Fordi jeg bruger aldeed:simple-schema og aldeed:collection2 Jeg skal sørge for at vedhæfte et ordentligt "Skema" til min samling.

Sådan:

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
});

Fejlfinding:

Hvordan fandt jeg ud af det?

Nå, jeg er ny i MongoDB - så jeg var tilbageholdende med at gå til konsollen og bare prøve at lave opdateringen derfra. Faktisk faldt det ikke engang ind for mig, før jeg talte med min kone.

Jeg prøvede alt og tilføjede citater omkring alt , ser på andres kode. Jeg tjekkede al MongoDBs fremragende dokumentation. Jeg kiggede på youtube videoer. Jeg kiggede på andre stackoverflow.com løsninger. Til sidst gik det op for mig, at alle andres kode ligner min kode, og dette skulle bare VIRKE. Jeg tilmeldte mig endda på Clarity.fm at stille et spørgsmål fra Sacha Greif for 1 USD i minuttet.

... Jeg begyndte at tro, at min mongo-database ikke virkede. Måske min mongo installationen var brudt?

Så okay, der er en test for det... Efter to dage med denne tortur kom det endelig til mig - prøv bare opdateringen i mongo-konsollen... (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
}

Når jeg vidste, at mongoen KUNNE lave min opdatering - jeg vidste det problemet måtte være med min meteoropsætning. Jeg ville have fundet et problem på meteor nu, hvis dette var et problem. Jeg søgte i alle mørke hjørner af Google og prøvede at finde ud af denne.

Det varede ikke længe, ​​før jeg huskede, at jeg havde det underligt valideringsproblemer før. Bortset fra, at disse valideringsproblemer altid kom med en fejl. Det faktum, at der ikke var nogen fejl, og at arrayet simpelthen blev opdateret med tomme objekter, kastede mig virkelig i en løkke.

Hvad jeg lærte:

  1. Hvis meteor først fejler, så prøv mongo-konsollen...
  2. I henhold til @David Weldon 's kommentar - en anden god fejlfindingsteknik, som ville have hjulpet mig, som jeg kunne have prøvet for længe siden, er at starte et nyt meteorprojekt og teste min kode derude, så tilføje pakker én ad gangen og se hvornår det/hvis nogen af ​​dem bryder koden. Denne test ville have påpeget, at koden grundlæggende var korrekt og kun behøvede det vedhæftede skema på grund af en tilføjet pakke.
  3. Tilføj ikke pakker blindt. Forstå, hvis/når pakker ændrer udviklingsflowet, såsom aldeed:collection2

Tak:

EN STOR TAK til @Michel Floyd og @David Weldon for al din hjælp til dette problem.

Vigtige links:

  1. Jeg lærte en del af almindelige fejl skrevet af @David Weldon
  2. dokumentationen for aldeed:collection2
  3. dokumentationen til aldeed:simple-schema
  4. Søg efter "Finding Data" på denne meteor-tutorial - den taler om fetch() og hvordan det er nyttigt. Dette hjalp mig under min fejlfinding af dette problem.
  5. Gennemgang af dokumentationen om opdatering fra MongoDB
  6. MongoDB $addToSet-dokumentation
  7. MongoDB $push-dokumentation
  8. [MongoDB Bios Eksempelsamling](https://docs .mongodb.com/manual/reference/bios-example-collection/] - Det var efter at have kigget på dokumenter som dette, at jeg virkelig fandt ud af, at der ikke er noget galt med mit databasedesign, der BURDE have været en måde at gøre dette på hele tiden (og det er der selvfølgelig)

Relateret spørgsmål:

[Løst] Sådan opdateres en række underdokumenter på en MongoDB-samling i MeteorJS




  1. MongoDB sammenligningsoperatorer med null

  2. Trin til at installere MongoDB på Amazon Linux

  3. mongodb-forespørgsel:$size med $gt returnerer altid 0

  4. MongoDB finder dokumenter, hvor alle array-elementer er lig med en eller anden værdi