MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mangouste :quoi de neuf avec _doc ?

Mettre à jour

J'ai peut-être mal compris votre question initiale, mais maintenant il semble que la nature de votre question a changé, donc les informations ci-dessous ne sont pas pertinentes, mais je les laisse. :)

J'ai testé votre code et il fonctionne bien pour moi. Mongoose n'exécute aucun code spécial lorsque vous définissez des propriétés qui ne font pas partie du schéma (ou quelques autres propriétés spéciales). Actuellement, JavaScript ne prend pas en charge le code d'appel pour les propriétés qui n'existent pas encore (donc Mongoose ne peut pas gêner l'ensemble du goo propriété par exemple).

Ainsi, lorsque vous définissez la propriété :

foo.goo = { c: 1 };

Mongoose n'est pas impliqué. Si votre console.log était quelque chose d'autre que le code que vous avez affiché, j'ai pu voir qu'il pourrait signaler de manière incorrecte.

De plus, lorsque vous send les résultats en JSON, JSON.stringify est appelé, qui appelle toString sur votre modèle de mangouste. Lorsque cela se produit, Mongoose utilise uniquement les propriétés définies sur le schéma. Ainsi, aucune propriété supplémentaire n'est renvoyée par défaut. Vous avez modifié la nature des data tableau cependant pour pointer directement vers les données de Mongoose, ce qui évite ce problème.

Détails sur le comportement normal

Lorsque vous définissez la propriété goo en utilisant Mongoose, il se passe pas mal de choses. Mongoose crée des getters/setters de propriété via Object.defineProperty (quelques docs ). Ainsi, lorsque vous définissez le goo propriété, que vous avez définie comme un [String] , quelques événements se produisent :

  1. Le code Mongoose est appelé avant que la valeur ne soit définie sur l'instance d'objet (contrairement à un simple objet JavaScript)
  2. Mongoose crée un tableau (facultatif) pour stocker les données (un MongooseArray ) qui contiendra les données du tableau. Dans l'exemple que vous avez fourni, puisque vous n'avez pas passé de tableau, il sera créé.
  3. Mongoose tentera de caster vos données dans le bon type
  4. Il appellera toString sur les données transmises dans le cadre du casting.

Ainsi, les résultats sont que le document contient maintenant un tableau avec un toString version de l'objet que vous avez passé.

Si vous avez vérifié le contenu du goo propriété, vous verriez qu'il s'agit maintenant d'un tableau avec un seul élément, qui est une chaîne contenant [object Object] . Si vous aviez choisi un type plus basique ou fait correspondre le type de stockage de propriété de destination, vous verriez qu'une vérification d'égalité de base aurait fonctionné.