sql >> Database >  >> NoSQL >> MongoDB

Hoe subdocumenten van een object in een array te retourneren met Meteor en MongoDB

!OPGELOST!

Het probleem hier is dat ik niet wist wat het pakket aldeed:collection2 aan het doen was met mijn code. Ik heb dit pakket toegevoegd om OrionJS te gebruiken (hier is de github-pagina ). En ik heb niet gemerkt dat deze aldeed:collection2 dwong validatie op al mijn updates. Ik kwam dit al eens tegen, maar het gaf me een foutmelding. In het verleden heb ik de fout kunnen traceren. Deze keer was er geen fout overal. Het zou de array bijwerken, maar met een leeg object. Zo verwarrend. Ik ga een probleem posten op aldeed:collection2 's projectpagina.

Uit de projectdocumentatie :"[aldeed:collection2 is een] Meteor-pakket waarmee u een schema aan een Mongo.Collection kunt koppelen. Automatisch valideren tegen dat schema bij het invoegen en bijwerken van client- of servercode."

De documentatie voor de correctie vindt u hier .

Oplossing:

Omdat ik aldeed:simple-schema gebruik en aldeed:collection2 Ik moet ervoor zorgen dat ik een goed "Schema" aan mijn verzameling voeg.

Vind ik leuk zo:

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

Problemen oplossen:

Hoe ben ik hier achter gekomen?

Nou, ik ben nieuw bij MongoDB - dus ik was terughoudend om naar de console te gaan en de update vanaf daar te proberen. Dit kwam zelfs niet bij me op totdat ik met mijn vrouw sprak.

Ik heb alles geprobeerd, aanhalingstekens toegevoegd rond alles , kijkend naar de code van anderen. Ik heb alle uitstekende documentatie van MongoDB bekeken. Ik keek naar youtube-video's. Ik heb gekeken naar andere stackoverflow.com-oplossingen. Eindelijk kwam het bij me op dat de code van iedereen er precies zo uitziet als mijn code, en dit zou gewoon moeten WERKEN. Ik heb me zelfs aangemeld op Clarity.fm om een ​​vraag te stellen aan Sacha Greif voor $1 per minuut.

... Ik begon te denken dat mijn Mongo-database niet werkte. Misschien mijn mongo installatie is mislukt?

Dus, oké, daar is een test voor... Na twee dagen van deze marteling kwam het eindelijk bij mij - probeer gewoon de update in de mongo-console... (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
}

Toen ik eenmaal wist dat die mongo mijn update KAN doen - ik wist het probleem moest met mijn meteooropstelling zijn. Ik zou nu een probleem met meteor hebben gevonden als dit een probleem was. Ik heb elke donkere hoek van Google doorzocht om deze te achterhalen.

Het duurde niet lang voordat ik me herinnerde dat ik raar . had validatieproblemen eerder. Behalve dat deze validatieproblemen altijd met een fout kwamen. Het feit dat er geen fout was en de array eenvoudig werd bijgewerkt met lege objecten bracht me echt in de war.

Wat ik heb geleerd:

  1. Als de eerste meteoor faalt, probeer dan de mongo-console...
  2. Volgens @David Weldon 's commentaar - een andere goede debugging-techniek die me zou hebben geholpen, die ik lang geleden had kunnen proberen, is om een ​​nieuw meteorenproject te starten en mijn code daar te testen, dan pakketten één voor één toe te voegen en te zien wanneer het / als een van hen breekt de code. Deze test zou hebben uitgewezen dat de code in wezen correct was en alleen het bijgevoegde schema nodig had vanwege een toegevoegd pakket.
  3. Voeg niet blindelings pakketten toe. Begrijp of/wanneer pakketten de ontwikkelingsstroom veranderen, zoals aldeed:collection2

Bedankt:

DANK aan @Michel Floyd en @David Weldon voor al je hulp bij dit probleem.

Belangrijke links:

  1. Ik heb nogal wat geleerd van veelvoorkomende fouten geschreven door @David Weldon
  2. De documentatie voor aldeed:collection2
  3. De documentatie voor aldeed:simple-schema
  4. Zoek naar "Gegevens vinden" op deze meteoor-tutorial - het praat over fetch() en hoe het nuttig is. Dit heeft me geholpen bij het oplossen van problemen met dit probleem.
  5. De documentatie over update bekijken van MongoDB
  6. MongoDB $addToSet-documentatie
  7. MongoDB $push-documentatie
  8. [MongoDB Bios-voorbeeldverzameling](https://docs .mongodb.com/manual/reference/bios-example-collection/] - Het was na het bekijken van dit soort documenten dat ik er echt achter kwam dat er niets mis is met mijn database-ontwerp, er MOET altijd een manier zijn geweest om dit te doen (en die is er natuurlijk)

Verwante vraag:

[Opgelost] Hoe een reeks subdocumenten op een MongoDB-verzameling in MeteorJS bij te werken




  1. Een item bijwerken in een array dat zich in een array bevindt

  2. Hoe kan ik met mongodb een aantal records per specifiek veld selecteren?

  3. Voorkom dat er null-velden in resultaat zijn wanneer $dateFromString op een veld wordt gebruikt

  4. Het hernoemen van een veld in een ingesloten document in een array in MongoDB werkt niet