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

Mangusta:che succede con _doc?

Aggiorna

Forse ho frainteso la tua domanda originale, ma ora sembra che la natura della tua domanda sia cambiata, quindi le informazioni seguenti non sono rilevanti, ma la lascio. :)

Ho testato il tuo codice e funziona bene per me. Mongoose non esegue alcun codice speciale quando si impostano proprietà che non fanno parte dello schema (o alcune altre proprietà speciali). JavaScript attualmente non supporta il codice di chiamata per proprietà che non esistono ancora (quindi Mongoose non può interferire con l'insieme di goo proprietà per esempio).

Quindi, quando imposti la proprietà:

foo.goo = { c: 1 };

La mangusta non è coinvolta. Se il tuo console.log era qualcosa di diverso dal codice che hai visualizzato, ho potuto vedere che potrebbe segnalare in modo errato.

Inoltre, quando send i risultati tornano come JSON, JSON.stringify viene chiamato, che chiama toString sul tuo modello Mangusta. Quando ciò accade, Mongoose utilizza solo le proprietà definite nello schema. Pertanto, per impostazione predefinita, nessuna proprietà aggiuntiva viene restituita. Hai cambiato la natura dei data array però per puntare direttamente ai dati Mongoose, quindi evita quel problema.

Dettagli sul comportamento normale

Quando imposti la proprietà goo usando Mongoose, accadono parecchie cose. Mongoose crea getter/setter di proprietà tramite Object.defineProperty (alcuni documenti ). Quindi, quando imposti il ​​goo proprietà, che hai definito come [String] , succedono alcune cose:

  1. Il codice Mongoose viene chiamato prima che il valore venga impostato sull'istanza dell'oggetto (a differenza di un semplice oggetto JavaScript)
  2. Mongoose crea un array (facoltativamente) per memorizzare i dati (un MongooseArray ) che conterrà i dati dell'array. Nell'esempio che hai fornito, poiché non hai passato un array, verrà creato.
  3. Mongoose tenterà di trasmettere i tuoi dati al tipo corretto
  4. Chiamerà toString sui dati passati come parte del cast.

Quindi, i risultati sono che il documento ora contiene un array con un toString versione dell'oggetto che hai passato.

Se hai controllato il contenuto del goo proprietà, vedresti che ora è un array con un singolo elemento, che è una stringa che contiene [object Object] . Se avessi scelto un tipo più semplice o fatto corrispondere il tipo di archiviazione della proprietà di destinazione, vedresti che un controllo di uguaglianza di base avrebbe funzionato.