Мангуст, поддокумент - это объекты, а не json

Я запрашиваю свой mongodb с помощью mongoose, но я не понимаю, почему возвращаемые поддокументы имеют тип только объекта, а не JSON.

С использованием

  hero.find({} ,{'deck' : {$elemMatch:{name:'Guard Tower'}}}, function(err, tower) {
    console.log(tower);
  }

возвращается

[ { _id: 507ac406ba6ecb1316000001,
    deck: 
     [ { name: 'Guard Tower',
         description: 'This tower shoots stuff.',
         cost: 13,
         sellValue: 7,
         radius: 180,
         speed: 40,
         dmg_min: 0,
         dmg_max: 0,
         actual_height: 40,
         sprite: 'guardtower_red.png',
         anim: [Object],
         size: [Object],
         projectile: [Object],
         upgrade: [Object] } ] } ]

Поддокумент, такой как анимация, размер, снаряд, обновление, является объектом, мне нужна вложенная информация, как я могу получить информацию? Без повторного запроса?


person MartinElvar    schedule 14.10.2012    source источник


Ответы (3)


Все документы и вложенные документы являются объектами в JavaScript. Просто console.log использует глубину по умолчанию 2 при вызове util.inspect для форматирования вашего документа для вывода. Вы можете вывести все уровни документа, вызвав util.inspect самостоятельно:

var util = require('util');

hero.find({} ,{'deck' : {$elemMatch:{name:'Guard Tower'}}}, function(err, tower) {
    console.log(util.inspect(tower, false, null)); 
});
person JohnnyHK    schedule 14.10.2012

JohnnyHK верен, однако более простой подход, если вы просто хотите выйти из JSON, будет

console.log(tower.toJSON());

Вы можете увидеть мой комментарий Родриго о том, почему это работает.

person Jason Cust    schedule 06.04.2015

Выполнение запроса к Mongoose с помощью find(), как и вы, вернет документы Mongoose (не JSON). Вы можете использовать метод lean() для возврата POJO:

hero
 .find({} ,{'deck' : {$elemMatch:{name:'Guard Tower'}}})
 .lean()
 .exec(function(err, tower) {
   //tower is a JSON here
   console.log(tower);
 });

Но то, что JohnnyHK сказал о журнале консоли, верно, он будет отображать только вложенные документы как [Object].

ОБНОВЛЕНИЕ: имейте в виду, что использование .lean() вернет объекты, а любые виртуальные поля или специальные геттеры, которые у вас могут быть, будут проигнорированы.

person Rodrigo Reis    schedule 06.04.2015
comment
Использование lean вернет POJO, а не JSON. Кроме того, если у вас есть какие-либо виртуальные поля или специальные функции получения, они не будут применяться и, следовательно, не будут представлены в POJO. Альтернативой, предполагающей, что схема имеет getters: true, было бы использование метода toJSON для mongoose документы как таковые: console.log(tower.toJSON()) - person Jason Cust; 07.04.2015
comment
Да. Это правда Джейсон. Любые виртуальные поля или геттеры будут пропущены. - person Rodrigo Reis; 07.04.2015