MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como retornar subdocumentos de um objeto em um array com Meteor e MongoDB

!RESOLVIDO!


O problema aqui é que eu não sabia qual era o pacote aldeed:collection2 estava fazendo com meu código. Eu adicionei este pacote para usar o OrionJS (aqui está a página do github ). E eu não percebi que este aldeed:collection2 estava forçando a validação em todas as minhas atualizações. Eu estava correndo para isso antes, mas estava me dando um erro. No passado eu era capaz de rastrear o erro. Desta vez, não houve nenhum erro qualquer lugar. Ele atualizaria o array, mas com um objeto vazio. Tão confuso. Vou postar um problema em aldeed:collection2 página do projeto.

Da documentação do projeto :"[aldeed:collection2 é um] pacote Meteor que permite anexar um esquema a um Mongo.Collection. Valida automaticamente em relação a esse esquema ao inserir e atualizar do código do cliente ou do servidor."

A documentação para a correção pode ser encontrada aqui .

Solução:


Porque estou usando aldeed:simple-schema e aldeed:collection2 Eu preciso ter certeza de anexar um "esquema" adequado à minha coleção.

Igual a:
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
});

Solução de problemas:


Como eu descobri isso?

Bem, sou novo no MongoDB - então estava relutante em ir ao console e tentar fazer a atualização a partir daí. Na verdade, isso nem me ocorreu até que eu estava conversando com minha esposa.

Tentei de tudo, adicionando aspas em tudo , olhando para o código de outras pessoas. Eu verifiquei toda a excelente documentação do MongoDB. Eu olhei vídeos do youtube. Eu olhei para outras soluções stackoverflow.com. Finalmente, ocorreu-me que o código de todos os outros se parece exatamente com o meu código, e isso deve apenas FUNCIONAR. Até me inscrevi no Clarity.fm para fazer uma pergunta de Sacha Greif por US$ 1 por minuto.

... Eu estava começando a pensar que meu banco de dados mongo não estava funcionando. Talvez meu mongo a instalação foi quebrada?

Então, tudo bem, há um teste para isso... Depois de dois dias dessa tortura, finalmente chegou a mim - Apenas tente a atualização no console do 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
}

Uma vez que eu soube que o mongo PODERIA fazer minha atualização - eu sabia o problema tinha que ser com minha configuração de meteoro. Eu já teria encontrado um problema no meteoro se isso fosse um problema. Eu procurei em todos os cantos escuros do google tentando descobrir isso.

Não demorou muito para eu me lembrar que estava tendo estranho problemas de validação antes. Exceto que esses problemas de validação sempre vinham com um erro. O fato de que não houve erro e o array foi simplesmente atualizado com objetos vazios realmente me deixou em um loop.

O que aprendi:

  1. Se o primeiro meteoro falhar, tente o console do mongo...
  2. De acordo com @David Weldon 's comment - outra boa técnica de depuração que teria me ajudado, que eu poderia ter tentado há muito tempo, é iniciar um novo projeto de meteoro e testar meu código lá fora, depois adicionar pacotes um de cada vez e ver quando / se qualquer um deles quebrar o código. Este teste teria apontado que fundamentalmente o código estava correto e só precisava do esquema anexado por causa de um pacote adicionado.
  3. Não adicione pacotes cegamente. Entenda se/quando os pacotes alteram o fluxo de desenvolvimento, como aldeed:collection2

Obrigado:


MUITO OBRIGADO a @Michel Floyd e @David Weldon por toda a ajuda neste problema.

Links importantes:

  1. Aprendi bastante com erros comuns escrito por @David Weldon
  2. A documentação para aldeed:collection2
  3. A documentação para aldeed:simple-schema
  4. Pesquise "Encontrando dados" este tutorial de meteoros - fala sobre fetch() e como é útil. Isso me ajudou durante a solução de problemas desse problema.
  5. Revisando a documentação sobre atualização do MongoDB
  6. Documentação do MongoDB $addToSet
  7. Documentação do MongoDB $push
  8. [Coleção de exemplos de bios do MongoDB](https://docs .mongodb.com/manual/reference/bios-example-collection/] - Foi depois de olhar para documentos como este que eu realmente descobri que não há nada de errado com o design do meu banco de dados, DEVERIA haver uma maneira de fazer isso o tempo todo (e há, obviamente)

Pergunta relacionada:


[Resolvido] Como atualizar uma matriz de subdocumentos em uma coleção do MongoDB no MeteorJS