sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo devolver subdocumentos de un objeto en una matriz con Meteor y MongoDB

!¡SOLUCIONADO!

El problema aquí es que no sabía qué era el paquete aldeed:collection2 estaba haciendo a mi código. Agregué este paquete para usar OrionJS (aquí está la página de github ). Y no me di cuenta de que este aldeed:collection2 estaba forzando la validación de todas mis actualizaciones. Me encontré con esto antes, pero me estaba dando un error. En el pasado pude rastrear el error. Esta vez, no hubo ningún error en cualquier sitio. Actualizaría la matriz, pero con un objeto vacío. Muy confuso. Voy a publicar un problema en aldeed:collection2 página del proyecto.

De la documentación del proyecto :"[aldeed:colección2 es un] paquete Meteor que le permite adjuntar un esquema a una Mongo.Collection. Valida automáticamente contra ese esquema al insertar y actualizar del código del cliente o del servidor."

La documentación para la corrección se puede encontrar aquí .

Solución:

Porque estoy usando aldeed:simple-schema y aldeed:collection2 Necesito asegurarme de adjuntar un "Esquema" adecuado a mi colección.

Así:

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

Resolución de problemas:

¿Cómo me di cuenta de esto?

Bueno, soy nuevo en MongoDB, por lo que no quería ir a la consola y tratar de hacer la actualización desde allí. De hecho, esto ni siquiera se me ocurrió hasta que estaba hablando con mi esposa.

Probé todo, agregando comillas alrededor de todo , mirando el código de otras personas. Revisé toda la excelente documentación de MongoDB. Miré videos de youtube. Miré otras soluciones de stackoverflow.com. Finalmente se me ocurrió que el código de todos los demás se ve exactamente como mi código, y esto debería FUNCIONAR. Incluso me registré en Clarity.fm para hacer una pregunta de Sacha Greif por $1 el minuto.

... Estaba empezando a pensar que mi base de datos mongo no funcionaba. Quizás mi mongo ¿Se interrumpió la instalación?

Entonces, está bien, hay una prueba para eso... Después de dos días de esta tortura, finalmente me llegó:solo prueba la actualización en la consola 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 vez que supe que mongo PODRÍA hacer mi actualización, lo supe el problema tenía que ser con mi configuración de meteoritos. Ya habría encontrado un problema en Meteor si esto fuera un problema. Busqué en todos los rincones oscuros de Google tratando de resolver esto.

No pasó mucho tiempo antes de que recordara que estaba teniendo raros problemas de validación antes. Excepto que estos problemas de validación siempre venían con un error. El hecho de que no hubo ningún error y la matriz simplemente se actualizó con objetos vacíos realmente me desconcertó.

Lo que aprendí:

  1. Si al principio meteor falla, prueba con la consola mongo...
  2. Según @David Weldon comentario de:otra buena técnica de depuración que me habría ayudado, que podría haber probado hace mucho tiempo es comenzar un nuevo proyecto de meteoros y probar mi código, luego agregar paquetes uno a la vez y ver cuándo / si cualquiera de ellos rompe el código. Esta prueba habría señalado que fundamentalmente el código era correcto y solo necesitaba el esquema adjunto debido a un paquete agregado.
  3. No agregue paquetes a ciegas. Comprenda si/cuándo los paquetes cambian el flujo de desarrollo, como aldeed:collection2

Gracias:

MUCHAS GRACIAS a @Michel Floyd y @David Weldon por toda su ayuda en este problema.

Enlaces importantes:

  1. Aprendí bastante de errores comunes escrito por @David Weldon
  2. La documentación para aldeed:collection2
  3. La documentación para aldeed:simple-schema
  4. Busque "Buscar datos" en este tutorial de meteoritos - Habla sobre fetch() y cómo es útil. Esto me ayudó durante mi solución de problemas en este problema.
  5. Revisando la documentación sobre la actualización de MongoDB
  6. Documentación de MongoDB $addToSet
  7. MongoDB $push Documentación
  8. [Colección de ejemplos de MongoDB Bios](https://docs .mongodb.com/manual/reference/bios-example-collection/] - Fue después de mirar documentos como este que realmente descubrí que no hay nada malo con el diseño de mi base de datos, DEBERÍA haber una manera de hacer esto todo el tiempo (y la hay, obviamente)

Pregunta relacionada:

[Resuelto] Cómo actualizar una matriz de subdocumentos en una colección MongoDB en MeteorJS