MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment renvoyer des sous-documents à partir d'un objet dans un tableau avec Meteor et MongoDB

 !RÉSOLU !

Le problème ici est que je ne savais pas ce que le paquet aldeed:collection2 faisait à mon code. J'ai ajouté ce package pour utiliser OrionJS (voici la page github ). Et je n'ai pas remarqué que cela aldeed:collection2 forçait la validation de toutes mes mises à jour. Je courais dans ce avant, mais il me donnait une erreur. Dans le passé, j'étais capable de retracer l'erreur. Cette fois, il n'y avait pas d'erreur partout. Cela mettrait à jour le tableau, mais avec un objet vide. Si confus. Je vais poster un problème sur aldeed:collection2 de la page du projet.

À partir de la documentation du projet :"[aldeed:collection2 est un] package Meteor qui vous permet d'attacher un schéma à une Mongo.Collection. Valide automatiquement par rapport à ce schéma lors de l'insertion et de la mise à jour à partir du code client ou serveur."

La documentation pour la correction peut être trouvée ici .

Solution :

Parce que j'utilise aldeed:simple-schema et aldeed:collection2 Je dois m'assurer d'attacher un "Schéma" approprié à ma collection.

J'aime donc :

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

Dépannage :

Comment ai-je compris cela ?

Eh bien, je suis nouveau sur MongoDB - j'étais donc réticent à aller sur la console et à essayer de faire la mise à jour à partir de là. En fait, cela ne m'est même pas venu à l'esprit jusqu'à ce que je parle avec ma femme.

J'ai tout essayé, en ajoutant des guillemets autour de tout , en regardant le code d'autres personnes. J'ai consulté toute l'excellente documentation de MongoDB. J'ai regardé des vidéos youtube. J'ai regardé d'autres solutions stackoverflow.com. Enfin, il m'est venu à l'esprit que le code de tout le monde ressemble exactement à mon code, et cela devrait fonctionner. Je me suis même inscrit sur Clarity.fm pour poser une question à Sacha Greif pour 1 $ la minute.

... Je commençais à penser que ma base de données mongo ne fonctionnait pas. Peut-être mon mongo l'installation a été interrompue ?

Donc, d'accord, il y a un test pour ça... Après deux jours de cette torture, ça m'est finalement venu - Essayez juste la mise à jour dans la console mongo... (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
}

Une fois que j'ai su que mongo POURRAIT faire ma mise à jour - je savais le problème devait être avec ma configuration météore. J'aurais trouvé un problème sur Meteor maintenant si c'était un problème. J'ai cherché dans tous les coins sombres de Google pour essayer de comprendre celui-ci.

Il ne fallut pas longtemps avant que je me rappelle que j'avais étrange problèmes de validation avant. Sauf que ces problèmes de validation s'accompagnaient toujours d'une erreur. Le fait qu'il n'y ait pas eu d'erreur et que le tableau ait été simplement mis à jour avec des objets vides m'a vraiment jeté dans une boucle.

Ce que j'ai appris :

  1. Si le météore tombe en panne au début, essayez la console mongo...
  2. Selon @David Weldon Le commentaire de - une autre bonne technique de débogage qui m'aurait aidé, que j'aurais pu essayer il y a longtemps est de démarrer un nouveau projet météore et de tester mon code là-bas, puis d'ajouter des packages un à la fois et de voir quand il/si l'un d'eux enfreint le code. Ce test aurait indiqué que fondamentalement, le code était correct et n'avait besoin que du schéma joint en raison d'un package ajouté.
  3. N'ajoutez pas de packages à l'aveuglette. Comprendre si/quand les packages modifient le flux de développement, comme aldeed:collection2

Merci :

UN GRAND MERCI à @Michel Floyd et @David Weldon pour toute votre aide sur ce problème.

Liens importants :

  1. J'ai beaucoup appris grâce aux erreurs courantes écrit par @David Weldon
  2. La documentation pour aldeed:collection2
  3. La documentation pour aldeed:simple-schema
  4. Recherchez "Finding Data" sur ce tutoriel sur les météores - il parle de fetch() et de son utilité. Cela m'a aidé lors de mon dépannage sur ce problème.
  5. Examiner la documentation sur la mise à jour depuis MongoDB
  6. Documentation MongoDB $addToSet
  7. Documentation MongoDB $push
  8. [Collection d'exemples de bios MongoDB](https://docs .mongodb.com/manual/reference/bios-example-collection/] - C'est après avoir examiné des documents comme celui-ci que j'ai vraiment compris qu'il n'y avait rien de mal avec la conception de ma base de données, il aurait dû y avoir un moyen de le faire depuis le début (et il y en a, évidemment)

Question connexe :

[Résolu] Comment mettre à jour un tableau de sous-documents sur une collection MongoDB dans MeteorJS