sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongoose:vad är det med _doc?

Uppdatera

Jag kanske missförstod din ursprungliga fråga, men nu ser det ut som att din frågas karaktär har ändrats, så informationen nedan är inte relevant, men jag lämnar den. :)

Jag testade din kod och den fungerar bra för mig. Mongoose kör ingen speciell kod när du ställer in egenskaper som inte är en del av schemat (eller några andra speciella egenskaper). JavaScript stöder för närvarande inte anropskod för egenskaper som ännu inte existerar (så Mongoose kan inte komma i vägen för uppsättningen av goo fastighet till exempel).

Så när du ställer in egenskapen:

foo.goo = { c: 1 };

Mongoose är inte inblandad. Om din console.log var något annat än koden du visade, kunde jag se att den rapporterade felaktigt.

Dessutom, när du send resultaten tillbaka som JSON, JSON.stringify anropas, vilket anropar toString på din Mongoose Model. När det händer använder Mongoose bara de egenskaper som definieras i schemat. Så inga ytterligare egenskaper skickas tillbaka som standard. Du har ändrat typen av data array men för att direkt peka på Mongoose-data, så det undviker det problemet.

Information om normalt beteende

När du ställer in egenskapen goo med Mongoose händer en hel del saker. Mongoose skapar egenskaper getters/setters via Object.defineProperty (några dokument ). Så när du ställer in goo egenskap, som du har definierat som en [String] , några saker händer:

  1. Mongoose-kod anropas innan värdet ställs in på objektinstansen (till skillnad från ett enkelt JavaScript-objekt)
  2. Mongoose skapar en array (valfritt) för att lagra data (en MongooseArray ) som kommer att innehålla matrisdata. I exemplet du angav, eftersom du inte klarade en array, kommer den att skapas.
  3. Mongoose kommer att försöka casta din data till rätt typ
  4. Den anropar toString på data som skickas som en del av skådespelet.

Så resultatet är att dokumentet nu innehåller en array med en toString version av objektet du skickade.

Om du kontrollerade innehållet i goo egenskap, skulle du se att det nu är en array med ett enda element, vilket är en sträng som innehåller [object Object] . Om du hade valt en mer grundläggande typ eller matchat lagringstypen för destinationsegendomen, skulle du se att en grundläggande jämställdhetskontroll skulle ha fungerat.



  1. Slinga med asynkrona callbacks i mongoose/mongodb/node

  2. Varför använder MongoDB inte fsync()?

  3. Hur man säkrar MongoDB med användarnamn och lösenord

  4. Autokomplettera med java, Redis, Elastic Search, Mongo