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:- O código do Mongoose é chamado antes do valor ser definido na instância do objeto (diferente de um objeto JavaScript simples)
- 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. - O Mongoose tentará converter seus dados no tipo certo
- 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.