MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongoose:какво става с _doc?

Актуализация

Може би съм разбрал погрешно първоначалния ви въпрос, но сега изглежда, че естеството на въпроса ви се е променило, така че информацията по-долу не е подходяща, но я оставям. :)

Тествах вашия код и работи добре за мен. Mongoose не изпълнява никакъв специален код, когато зададете свойства, които не са част от схемата (или няколко други специални свойства). Понастоящем JavaScript не поддържа извикващ код за свойства, които все още не съществуват (така че Mongoose не може да пречи на набора от goo собственост например).

И така, когато зададете свойството:

foo.goo = { c: 1 };

Mongoose не е замесен. Ако вашият console.log беше нещо различно от кода, който показахте, видях, че може да докладва неправилно.

Освен това, когато send резултатите обратно като JSON, JSON.stringify се извиква, което извиква toString на вашия модел Mongoose. Когато това се случи, Mongoose използва само свойствата, дефинирани в схемата. Така че по подразбиране не се връщат допълнителни свойства. Вие променихте характера на data масив, но да сочи директно към данните на Mongoose, така че избягва този проблем.

Подробности за нормалното поведение

Когато зададете свойството goo с помощта на Mongoose се случват доста неща. Mongoose създава инструменти за получаване/задаване на свойства чрез Object.defineProperty (някои документи ). Така че, когато зададете goo свойство, което сте дефинирали като [String] , се случват няколко неща:

  1. Кодът на Mongoose се извиква преди стойността да бъде зададена в екземпляра на обекта (за разлика от обикновен JavaScript обект)
  2. Mongoose създава масив (по избор) за съхраняване на данните (MongooseArray ), който ще съдържа данните от масива. В дадения от вас пример, тъй като не сте предали масив, той ще бъде създаден.
  3. Mongoose ще се опита да прехвърли вашите данни към правилния тип
  4. Ще извика toString върху данните, предадени като част от предаването.

И така, резултатите са, че документът вече съдържа масив с toString версия на обекта, който сте предали.

Ако сте проверили съдържанието на goo свойство, ще видите, че сега е масив с един елемент, който е низ, който съдържа [object Object] . Ако сте избрали по-основен тип или сте съпоставили типа на съхранение на целевото свойство, ще видите, че основната проверка за равенство щеше да работи.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Издърпайте и добавете задаване едновременно с монго

  2. Трябва ли изрично да затварям връзката?

  3. Мога ли да намаля текст в mongodb?

  4. Meteor / ReactJS - Проблем с мигане на потребителския интерфейс:изобразяване два пъти преди и след проверка на база данни

  5. Прототип на Mongoose:как да вмъкнете URL динамично?