sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongoose:hvad sker der med _doc?

Opdater

Måske har jeg misforstået dit oprindelige spørgsmål, men nu ser det ud til, at karakteren af ​​dit spørgsmål har ændret sig, så nedenstående oplysninger er ikke relevante, men jeg lader være. :)

Jeg testede din kode, og den fungerer fint for mig. Mongoose udfører ikke nogen speciel kode, når du angiver egenskaber, der ikke er en del af skemaet (eller et par andre specielle egenskaber). JavaScript understøtter i øjeblikket ikke kaldekode for egenskaber, der endnu ikke eksisterer (så Mongoose kan ikke komme i vejen for sættet af goo ejendom for eksempel).

Så når du indstiller egenskaben:

foo.goo = { c: 1 };

Mongoose er ikke involveret. Hvis din console.log var noget andet end den kode du viste, kunne jeg se, at den muligvis rapporterede forkert.

Derudover, når du send resultaterne tilbage som JSON, JSON.stringify bliver kaldt, hvilket kalder toString på din Mongoose Model. Når det sker, bruger Mongoose kun de egenskaber, der er defineret på skemaet. Så ingen yderligere egenskaber sendes tilbage som standard. Du har ændret arten af ​​data array dog ​​for direkte at pege på Mongoose-dataene, så det undgår det problem.

Detaljer om normal adfærd

Når du indstiller egenskaben goo ved at bruge Mongoose sker der en del ting. Mongoose opretter egenskaber/sættere via Object.defineProperty (nogle dokumenter ). Så når du indstiller goo egenskab, som du har defineret som en [String] , der sker et par ting:

  1. Mongoose-kode kaldes før værdien indstilles på objektforekomsten (i modsætning til et simpelt JavaScript-objekt)
  2. Mongoose opretter en matrix (valgfrit) til at gemme dataene (en MongooseArray ), som vil indeholde array-dataene. I det eksempel, du angav, vil det blive oprettet, da du ikke bestod et array.
  3. Mongoose vil forsøge at caste dine data til den rigtige type
  4. Den kalder toString på de data, der sendes som en del af castet.

Så resultaterne er, at dokumentet nu indeholder en matrix med en toString version af det objekt, du har passeret.

Hvis du har tjekket indholdet af goo egenskab, vil du se, at det nu er et array med et enkelt element, som er en streng, der indeholder [object Object] . Hvis du havde valgt en mere grundlæggende type eller matchet destinationsejendommens lagertype, ville du se, at en grundlæggende lighedskontrol ville have fungeret.



  1. MongoDB dokumentdesign til kommentarer (og deres svarkommentarer)

  2. For loop in redis med nodejs asynkrone anmodninger

  3. Hent relevansbestemt resultat fra tekstforespørgsel på MongoDB Collection ved hjælp af C#-driveren

  4. MongoDB Update Deep Array