0

我正在使用 mongoose 查询我的 mongodb,但我不明白为什么返回的子文档只是 Object 类型,而不是 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] } ] } ]

像动画,大小,弹丸,升级等子文档,是对象,我需要嵌套的信息,我怎样才能得到信息?不进行另一个查询?

4

3 回答 3

1

所有文档和子文档都是 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)); 
});
于 2012-10-14T20:51:03.443 回答
0

像您一样使用 find() 在 Mongoose 上进行查询将返回 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() 将返回对象,并且您可能拥有的任何虚拟字段或特殊 getter 都将被忽略。

于 2015-04-06T23:23:37.707 回答
0

JohnnyHK 是正确的,但是如果您只想注销 JSON,则更简单的方法是

console.log(tower.toJSON());

您可以查看我对 Rodrigo 的评论,了解为什么会这样。

于 2015-04-06T23:56:18.890 回答