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

Mangusto:o que há com _doc?

Atualizar


Talvez eu tenha entendido mal a sua pergunta original, mas agora parece que a natureza da sua pergunta mudou, então as informações abaixo não são relevantes, mas vou deixá-las. :)

Eu testei seu código e funcionou bem para mim. O Mongoose não executa nenhum código especial quando você define propriedades que não fazem parte do esquema (ou algumas outras propriedades especiais). JavaScript atualmente não suporta código de chamada para propriedades que ainda não existem (portanto, o Mongoose não pode atrapalhar o conjunto do goo propriedade, por exemplo).

Então, quando você define a propriedade:
foo.goo = { c: 1 };

Mangusto não está envolvido. Se o seu console.log era algo diferente do código que você exibiu, pude ver que ele pode relatar incorretamente.

Além disso, quando você send os resultados de volta como JSON, JSON.stringify está sendo chamado, o que chama toString em seu modelo de mangusto. Quando isso acontece, o Mongoose usa apenas as propriedades definidas no esquema. Portanto, nenhuma propriedade adicional está sendo enviada de volta por padrão. Você alterou a natureza dos data array para apontar diretamente para os dados do Mongoose, para evitar esse problema.

Detalhes sobre o comportamento normal


Quando você define a propriedade goo usando o Mongoose, algumas coisas acontecem. Mongoose cria getters/setters de propriedade através do Object.defineProperty (alguns docs ). Então, quando você define o goo propriedade, que você definiu como um [String] , algumas coisas acontecem:
  1. O código do Mongoose é chamado antes do valor ser definido na instância do objeto (diferente de um objeto JavaScript simples)
  2. Mongoose cria um array (opcionalmente) para armazenar os dados (um MongooseArray ) que conterá os dados da matriz. No exemplo que você forneceu, como você não passou um array, ele será criado.
  3. O Mongoose tentará converter seus dados no tipo certo
  4. Ele chamará toString nos dados passados ​​como parte do elenco.

Então, os resultados são que o documento agora contém um array com um toString versão do objeto que você passou.

Se você verificou o conteúdo do goo propriedade, você verá que agora é uma matriz com um único elemento, que é uma string que contém [object Object] . Se você tivesse escolhido um tipo mais básico ou correspondido ao tipo de armazenamento de propriedade de destino, você veria que uma verificação de igualdade básica teria funcionado.