sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man returnerar underdokument från ett objekt i en array med Meteor och MongoDB

!LÖST!

Problemet här är att jag inte var medveten om vad paketet aldeed:collection2 gjorde med min kod. Jag lade till det här paketet för att använda OrionJS (här är github-sidan ). Och jag märkte inte att denna aldeed:collection2 tvingade fram validering av alla mina uppdateringar. Jag har stött på det här förut, men det gav mig ett fel. Tidigare kunde jag spåra felet. Den här gången var det inget fel var som helst. Det skulle uppdatera arrayen, men med ett tomt objekt. Så förvirrande. Jag kommer att lägga upp ett problem på aldeed:collection2 s projektsida.

Från projektdokumentationen :"[aldeed:collection2 är ett] Meteorpaket som låter dig bifoga ett schema till en Mongo.Collection. Verifierar automatiskt mot det schemat vid infogning och uppdatering från klient- eller serverkod."

dokumentationen för korrigeringen finns här .

Lösning:

Eftersom jag använder aldeed:simple-schema och aldeed:collection2 Jag måste se till att bifoga ett korrekt "schema" till min samling.

Som så:

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

Felsökning:

Hur kom jag på det här?

Tja, jag är ny på MongoDB - så jag var ovillig att gå till konsolen och bara försöka göra uppdateringen därifrån. Faktum är att detta inte ens föll mig förrän jag pratade med min fru.

Jag försökte allt och la till citat runt allt , tittar på andras kod. Jag kollade in all MongoDB:s utmärkta dokumentation. Jag tittade på youtube-filmer. Jag tittade på andra stackoverflow.com-lösningar. Till slut kom det upp för mig att alla andras kod ser exakt ut som min kod, och det här borde bara FUNKA. Jag registrerade mig till och med på Clarity.fm för att ställa en fråga från Sacha Greif för 1 USD per minut.

... Jag började tro att min mongodatabas inte fungerade. Kanske min mongo Installationen gick sönder?

Så, okej, det finns ett test för det... Efter två dagar av denna tortyr kom det äntligen till mig - Testa bara uppdateringen i mongokonsolen... (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 jag visste att mongon KUNNE göra min uppdatering - jag visste problemet måste vara med min meteoruppställning. Jag skulle ha hittat ett problem på meteor nu om detta var ett problem. Jag sökte i alla mörka hörn av Google för att försöka komma på det här.

Det dröjde inte länge innan jag kom ihåg att jag hade det konstigt valideringsproblem tidigare. Förutom att dessa valideringsproblem alltid kom med ett fel. Det faktum att det inte fanns något fel och att arrayen helt enkelt uppdaterades med tomma objekt fick mig verkligen att luras.

Vad jag lärde mig:

  1. Om meteor först misslyckas, prova mongokonsolen...
  2. I enlighet med @David Weldon s kommentar - en annan bra felsökningsteknik som skulle ha hjälpt mig, som jag kunde ha provat för länge sedan är att starta ett nytt meteorprojekt och testa min kod där ute, sedan lägga till paket ett i taget och se när det/om det någon av dem bryter koden. Detta test skulle ha påpekat att koden i grunden var korrekt och bara behövde det bifogade schemat på grund av ett tillagt paket.
  3. Lägg inte till paket blint. Förstå om/när paket ändrar utvecklingsflödet som aldeed:collection2

Tack:

ETT STORT TACK till @Michel Floyd och @David Weldon för all din hjälp med detta problem.

Viktiga länkar:

  1. Jag lärde mig en hel del av vanliga misstag skriven av @David Weldon
  2. dokumentationen för aldeed:collection2
  3. dokumentationen för aldeed:simple-schema
  4. Sök efter "Finding Data" på denna meteortutorial - den talar om fetch() och hur det är användbart. Detta hjälpte mig under min felsökning av det här problemet.
  5. Granska dokumentationen om uppdatering från MongoDB
  6. MongoDB $addToSet-dokumentation
  7. MongoDB $push-dokumentation
  8. [MongoDB Bios exempelsamling](https://docs .mongodb.com/manual/reference/bios-example-collection/] - Det var efter att ha tittat på sådana här dokument som jag verkligen kom på att det inte är något fel på min databasdesign, det BORDE ha funnits ett sätt att göra detta hela tiden (och det finns det så klart)

Relaterad fråga:

[Löst] Hur man uppdaterar en rad underdokument på en MongoDB-samling i MeteorJS




  1. Kombinera två $or-påståenden

  2. Stöder azure saker som mongodb och redis?

  3. Extrahera en lista med delsträngar från MongoDB med ett reguljärt uttryck

  4. Flask &MongoDB - For Loop fungerar inte