MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So geben Sie Filialdokumente von einem Objekt in einem Array mit Meteor und MongoDB zurück

!GELÖST!

Das Problem hier ist, dass ich nicht wusste, was das Paket aldeed:collection2 ist tat zu meinem Code. Ich habe dieses Paket hinzugefügt, um OrionJS zu verwenden (Hier ist die github-Seite ). Und ich habe nicht bemerkt, dass diese aldeed:collection2 erzwang die Validierung aller meiner Updates. Ich bin vorher darauf gestoßen, aber es hat mir einen Fehler gegeben. In der Vergangenheit konnte ich den Fehler zurückverfolgen. Diesmal gab es keinen Fehler irgendwo. Es würde das Array aktualisieren, aber mit einem leeren Objekt. So verwirrend. Ich werde eine Ausgabe auf aldeed:collection2 veröffentlichen Projektseite von .

Aus der Projektdokumentation :"[aldeed:collection2 ist ein] Meteor-Paket, mit dem Sie ein Schema an eine Mongo.Collection anhängen können. Validiert automatisch anhand dieses Schemas beim Einfügen und Aktualisieren vom Client- oder Servercode."

Die Dokumentation zur Korrektur finden Sie hier .

Lösung:

Weil ich aldeed:simple-schema verwende und aldeed:collection2 Ich muss sicherstellen, dass ich meiner Sammlung ein korrektes „Schema“ anhänge.

So:

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

Fehlerbehebung:

Wie habe ich das herausgefunden?

Nun, ich bin neu bei MongoDB - also zögerte ich, zur Konsole zu gehen und einfach zu versuchen, das Update von dort aus durchzuführen. Tatsächlich ist mir das erst in den Sinn gekommen, als ich mit meiner Frau gesprochen habe.

Ich habe alles versucht und alles in Anführungszeichen gesetzt , indem Sie sich den Code anderer Leute ansehen. Ich habe mir die gesamte hervorragende Dokumentation von MongoDB angesehen. Ich habe mir Youtube-Videos angeschaut. Ich habe mir andere Lösungen von stackoverflow.com angesehen. Schließlich fiel mir ein, dass der Code aller anderen genauso aussieht wie mein Code, und das sollte einfach FUNKTIONIEREN. Ich habe mich sogar bei Clarity.fm angemeldet um eine Frage von Sacha Greif zu stellen für $1 pro Minute.

... Ich fing an zu glauben, dass meine Mongo-Datenbank nicht funktionierte. Vielleicht mein Mongo Installation war defekt?

Also, okay, dafür gibt es einen Test... Nach zwei Tagen dieser Tortur kam es endlich zu mir - Probiere einfach das Update in der Mongo-Konsole... (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
}

Sobald ich wusste, dass Mongo mein Update machen KÖNNTE - ich wusste Das Problem musste bei meinem Meteor-Setup liegen. Ich hätte jetzt ein Problem auf Meteor gefunden, wenn dies ein Problem wäre. Ich habe jede dunkle Ecke von Google durchsucht, um das herauszufinden.

Es dauerte nicht lange, bis ich mich daran erinnerte, dass ich seltsam hatte Validierungsprobleme vor. Außer diese Validierungsprobleme traten immer mit einem Fehler auf. Die Tatsache, dass es keinen Fehler gab und das Array einfach mit leeren Objekten aktualisiert wurde, hat mich wirklich aus der Fassung gebracht.

Was ich gelernt habe:

  1. Wenn Meteor zuerst fehlschlägt, versuchen Sie es mit der Mongo-Konsole...
  2. Gemäß @David Weldon 's Kommentar - eine weitere gute Debugging-Technik, die mir geholfen hätte, die ich schon vor langer Zeit hätte ausprobieren können, ist, ein neues Meteor-Projekt zu starten und meinen Code dort draußen zu testen, dann Pakete einzeln hinzuzufügen und zu sehen, wann es/ob Jeder von ihnen bricht den Code. Dieser Test hätte deutlich gemacht, dass der Code grundsätzlich korrekt war und nur das angehängte Schema aufgrund eines hinzugefügten Pakets benötigte.
  3. Fügen Sie Pakete nicht blind hinzu. Verstehen Sie, ob/wann Pakete den Entwicklungsfluss ändern, wie z. B. aldeed:collection2

Vielen Dank:

EIN GROSSES DANKESCHÖN an @Michel Floyd und @David Weldon für all Ihre Hilfe bei diesem Problem.

Wichtige Links:

  1. Ich habe einiges aus häufigen Fehlern gelernt geschrieben von @David Weldon
  2. Die Dokumentation für aldeed:collection2
  3. Die Dokumentation für aldeed:simple-schema
  4. Suchen Sie in diesem Meteor-Tutorial - Es spricht über fetch() und wie es hilfreich ist. Das hat mir bei der Fehlersuche bei diesem Problem geholfen.
  5. Lesen Sie die Dokumentation zum Update von MongoDB
  6. MongoDB $addToSet-Dokumentation
  7. MongoDB $push-Dokumentation
  8. [MongoDB-Bios-Beispielsammlung](https://docs .mongodb.com/manual/reference/bios-example-collection/] - Nachdem ich mir Dokumente wie dieses angeschaut hatte, wurde mir wirklich klar, dass an meinem Datenbankdesign nichts falsch ist, es hätte die ganze Zeit eine Möglichkeit geben müssen, dies zu tun (und die gibt es offensichtlich)

Verwandte Frage:

[Gelöst] So aktualisieren Sie ein Array von Unterdokumenten in einer MongoDB-Sammlung in MeteorJS