2016-06-08 6 views
1

Dies ist eine Folgefrage von meinem vorherigen question hier auf stackoverflow.com.Zurückgeben von Filialdokumenten aus einem Objekt in einem Array mit Meteor und MongoDB

Erstens, Dank @David Weldon: Ich konnte mein Update richtig strukturieren. Aber wenn ich gehe, um die Ausgabe von der Datenbank zu bekommen, fehlt das Objekt, das ich zu score hinzugefügt habe.

Vielleicht ist dies das Standardverhalten von db.ideas.find(). Ich erwartete, die Filialdokumente auch zu erhalten, wenn ich die db.ideas.find() ausführte.

Code I lief:

Ideas.update("bKXXrpYmppFBfq9Kx", { 
    $addToSet: { 
    score: { userId: "W9YEs84QFhZzJeB6j", score: 1 }, 
    votedOnBy: "W9YEs84QFhZzJeB6j" 
    }, 
    $inc: { 
    overallScore: 1, 
    timesVotedOn: 1 
    } 
}); 

Ausgabe von Mongo db Konsole:

meteor:PRIMARY> db.ideas.find() 
{ 
    "_id" : "bKXXrpYmppFBfq9Kx", 
    "title" : "Jump through the portal", 
    "body" : "The elves from Eldernland should jump through the blue portal mentioned in episode one.", 
    "userId" : "W9YEs84QFhZzJeB6j", 
    "author" : "Nate Beck", 
    "episodeId" : "LbDynnAHxAgM5PPXM", 
    "timestamp" : ISODate("2016-06-07T20:37:05.775Z"), 
    "votedOnBy" : [ 
     "W9YEs84QFhZzJeB6j" 
    ], 
    "timesVotedOn" : 3, 
    "score" : [ 
     { 

     } 
    ], 
    "overallScore" : 1 
} 

Ich hatte erwartet, um zu sehen, was in "Score" war das sieht aus wie ein leeres Objekt.

Irgendwelche Ideen, was hier falsch läuft?

+0

'.find()' und '.findOne()' Format etwas anders in der Meteor Mongo Konsole, versuchen diese. Oder versuchen Sie 'db.ideas.findOne (id) .score' –

+0

@ Jeremy Ich vermute, dass Sie nur Dokumente sehen, die durch vorherige Versuche eingefügt wurden und/oder Sie von mehr als einer Stelle einfügen. Wenn dies eine Entwicklungsumgebung ist, versuchen Sie es einfach mit 'db.ideas.remove ({})' und starten Sie dann die App erneut (oder führen Sie 'meteor reset' aus). Siehe auch [Häufige Fehler] (https://dweldon.silvrback.com/common-mistakes) für findOne vs fetch in meteor. –

+0

[@Michel Floyd] (http://stackoverflow.com/users/2805154/michel-floyd): Danke für den Vorschlag. Ich habe es versucht, ohne Glück. Hier ist die [Ausgabe meiner Konsole:] (https://git.io/vom7c) https://git.io/vom7c –

Antwort

0

! Gelöst!

Das Problem hier ist, dass ich nicht wusste, was das Paket aldeed:collection2 mit meinem Code machte. Ich habe dieses Paket hinzugefügt, um OrionJS zu verwenden (hier ist die github page). Und ich habe nicht bemerkt, dass diese aldeed:collection2 Validierung für alle meine Updates erzwang. Ich bin schon einmal darauf gestoßen, aber es gab mir einen Fehler. In der Vergangenheit konnte ich den Fehler zurückverfolgen. Dieses Mal gab es keinen Fehler überall. Es würde das Array aktualisieren, aber mit einem leeren Objekt. So verwirrend. Ich werde ein Problem auf der Projektseite aldeed:collection2 veröffentlichen.

Vom project documentation: "[aldeed:collection2 ist a] Meteor-Paket, das Sie ein Schema zu einem Mongo.Collection befestigen kann validiert automatisch gegen dieses Schema beim Einsetzen und von Client- oder Server-Code zu aktualisieren.."

Die documentation für die Korrektur kann here gefunden werden.


Lösung:

Weil ich aldeed:simple-schema und aldeed:collection2 mit Ich muß sicherstellen, dass ein richtiges „Schema“, um meine Sammlung zu befestigen.

wie folgt:

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 in MongoDB - also wollte ich nicht zur Konsole gehen und nur versuchen, das Update von dort zu machen. Tatsächlich fiel mir das erst ein, als ich mit meiner Frau sprach.

Ich habe alles versucht, Anführungszeichen um alles Hinzufügen anderer Leute Code suchen. Ich habe alle hervorragenden MongoDB-Dokumente ausgecheckt. Ich habe Youtube-Videos angeschaut. Ich schaute auf andere stackoverflow.com Lösungen. Endlich fiel mir auf, dass der Code aller anderen genauso aussieht wie mein Code, und das sollte einfach funktionieren. Ich habe mich sogar unter Clarity.fm angemeldet, um eine Frage von Sacha Greif für $ 1 pro Minute zu stellen.

... Ich begann zu denken, dass meine Mongo-Datenbank nicht funktionierte. Vielleicht mein Mongo Installation wurde gebrochen?

Also, okay, es ist ein Test für die ... Nach zwei Tagen dieser Folter für mich ist es schließlich kam - gerade das Update in der Mongo-Konsole versuchen ... (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 könnte mein Update tun - ich wusste das Problem musste mit meinem Meteor Setup sein. Ich hätte jetzt ein Problem auf dem Meteor gefunden, wenn das ein Problem wäre. Ich habe jede dunkle Ecke von Google durchsucht und versucht, diese herauszufinden.

Es dauerte nicht lange, bis ich mich daran erinnerte, dass ich seltsame Validierungsprobleme hatte. Außer diesen Validierungsproblemen kam immer ein Fehler. Die Tatsache, dass es keinen Fehler gab und das Array einfach mit leeren Objekten aktualisiert wurde, warf mich wirklich auf eine Schleife.


Was ich gelernt habe:

  1. Wenn zuerst Meteor ausfällt, die Mongo Konsole versuchen ...
  2. Per @David Weldon ‚s Kommentar - eine weitere gute Debugging-Technik, die mir geholfen haben würde, was ich vor langer Zeit hätte ausprobieren können, ist ein neues Meteorprojekt zu starten und meinen Code dort draußen zu testen, dann Pakete einzeln hinzuzufügen und zu sehen, wann/wenn einer von ihnen den Code bricht. Dieser Test hätte darauf hingewiesen, dass der Code grundsätzlich korrekt war und nur das angehängte Schema wegen eines hinzugefügten Pakets benötigt.
  3. Fügen Sie nicht blind Pakete hinzu. Verstehen Sie, wenn/wenn Pakete den Fluss der Entwicklung wie verändern aldeed:collection2

Danke:

Vielen Dank an @Michel Floyd und @David Weldon für Ihre Hilfe zu diesem Problem.


Wichtige Links:

  1. Ich lernte einiges von common mistakes geschrieben von @David Weldon
  2. Die documentation for aldeed:collection2
  3. Die documentation for aldeed:simple-schema
  4. Suche nach "Suchen von Daten" auf this meteor tutorial - es spricht über fetch() und wie es hilfreich ist. Dies half mir bei der Fehlersuche zu diesem Problem.
  5. Überprüfung der documentation on about update von MongoDB
  6. MongoDB $addToSet Documentation
  7. MongoDB $push Documentation
  8. [MongoDB Bios Beispiel Sammlung] (https://docs.mongodb.com/manual/reference/bios-example-collection/] - Es wurde nach wie dies in dem Dokument, die mich wirklich dort heraus nichts falsch mit meinem Datenbank-Design, es sollte eine Möglichkeit, dies zu tun, die ganze Zeit (und es ist offensichtlich)

Verwandte Frage gewesen:

[Solved] How to Update An Array of Subdocuments on a MongoDB Collection in MeteorJS

+0

Nice write-up. Ein anderes wichtiges Debugging-Verfahren besteht darin, mit einem leeren Projekt zu beginnen und Dinge hinzuzufügen, bis es nicht mehr ordnungsgemäß funktioniert. In diesem Fall hätte eine One-File-App ohne collection2 gezeigt, dass der Code grundsätzlich korrekt ist. –

+0

[@ David Weldon] (http://stackoverflow.com/users/635981/david-weldon): Vielen Dank - du hast Recht. Lustige Sache, ich habe ein Projekt erstellt, um jemandes Problem zu beantworten [hier] (http://stackoverflow.com/a/37692455/484732) - Ich tat dies hauptsächlich für Klarheit für ihn. Aber jetzt, wo du sagst, dass ich realisiere, dass ich das auch für mich selbst hätte tun können, aber in meinem Fall als Debugging-Technik. Ich bin neu im Meteor (wie du sehen kannst). Vielen Dank für Ihre Zeit und Aufmerksamkeit. –

Verwandte Themen