MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come restituire documenti secondari da un oggetto in un array con Meteor e MongoDB

!RISOLTO!

Il problema qui è che non sapevo quale fosse il pacchetto aldeed:collection2 stava facendo al mio codice. Ho aggiunto questo pacchetto per utilizzare OrionJS (ecco la pagina github ). E non ho notato che questo aldeed:collection2 stava forzando la convalida su tutti i miei aggiornamenti. Mi sono imbattuto in questo prima, ma mi dava un errore. In passato sono stato in grado di rintracciare l'errore. Questa volta, nessun errore ovunque. Aggiornerebbe l'array, ma con un oggetto vuoto. Così confuso. Pubblicherò un problema su aldeed:collection2 pagina del progetto di.

Dalla documentazione del progetto :"[aldeed:collection2 è un] pacchetto Meteor che consente di allegare uno schema a una Mongo.Collection. Convalida automaticamente in base a tale schema durante l'inserimento e l'aggiornamento dal codice client o server."

La documentazione per la correzione si può trovare qui .

Soluzione:

Perché sto usando aldeed:simple-schema e aldeed:collection2 Devo assicurarmi di allegare uno "Schema" adeguato alla mia raccolta.

Così:

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

Risoluzione dei problemi:

Come l'ho capito?

Bene, sono nuovo di MongoDB, quindi ero riluttante ad andare alla console e provare a eseguire l'aggiornamento da lì. In realtà, questo non mi è nemmeno venuto in mente finché non ho parlato con mia moglie.

Ho provato di tutto, aggiungendo virgolette intorno a tutto , guardando il codice di altre persone. Ho controllato tutta l'eccellente documentazione di MongoDB. Ho guardato i video di youtube. Ho esaminato altre soluzioni di StackOverflow.com. Alla fine mi è venuto in mente che il codice di tutti gli altri assomiglia esattamente al mio codice e questo dovrebbe FUNZIONARE. Mi sono persino registrato su Clarity.fm per porre una domanda a Sacha Greif per $ 1 al minuto.

... Stavo cominciando a pensare che il mio database mongo non funzionasse. Forse mio mongo l'installazione è stata interrotta?

Quindi, ok, c'è un test per questo... Dopo due giorni di questa tortura finalmente è arrivato a me - Prova solo l'aggiornamento nella 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
}

Una volta che ho saputo che mongo POTREBBE fare il mio aggiornamento, sapevo il problema doveva essere con la mia configurazione meteor. A questo punto avrei trovato un problema su meteor se questo fosse un problema. Ho cercato in ogni angolo oscuro di Google cercando di capire questo.

Non passò molto tempo prima che mi ricordassi che stavo avendo strano problemi di convalida prima. Tranne che questi problemi di convalida si presentavano sempre con un errore. Il fatto che non ci fossero errori e che l'array fosse semplicemente aggiornato con oggetti vuoti mi ha davvero messo in crisi.

Cosa ho imparato:

  1. Se all'inizio meteor fallisce, prova la console mongo...
  2. Secondo @David Weldon Il commento di - un'altra buona tecnica di debug che mi avrebbe aiutato, che avrei potuto provare molto tempo fa è avviare un nuovo progetto meteor e testare il mio codice là fuori, quindi aggiungere i pacchetti uno alla volta e vedere quando / se nessuno di loro rompe il codice. Questo test avrebbe evidenziato che fondamentalmente il codice era corretto e richiedeva solo lo schema allegato a causa di un pacchetto aggiunto.
  3. Non aggiungere pacchetti alla cieca. Capire se/quando i pacchetti cambiano il flusso di sviluppo come aldeed:collection2

Grazie:

UN GRANDE GRAZIE a @Michel Floyd e @David Weldon per tutto il tuo aiuto su questo problema.

Link importanti:

  1. Ho imparato molto da errori comuni scritto da @David Weldon
  2. La documentazione per aldeed:collection2
  3. La documentazione per aldeed:simple-schema
  4. Cerca "Finding Data" su questo tutorial su meteorite - parla di fetch() e di come è utile. Questo mi ha aiutato durante la risoluzione dei problemi su questo problema.
  5. Esaminare la documentazione sull'aggiornamento da MongoDB
  6. Documentazione MongoDB $addToSet
  7. Documentazione MongoDB $push
  8. [Raccolta di esempi di MongoDB Bios](https://docs .mongodb.com/manual/reference/bios-example-collection/] - È stato dopo aver esaminato documenti come questo che ho davvero capito che non c'è niente di sbagliato nella progettazione del mio database, DOVREBBE esserci sempre stato un modo per farlo (e c'è, ovviamente)

Domanda correlata:

[Risolto] Come aggiornare una serie di documenti secondari su una raccolta MongoDB in MeteorJS