簡體   English   中英

貓鼬,子文檔是對象而不是json

[英]Mongoose, sub document is objects and not json

我正在使用貓鼬查詢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] } ] } ]

子文檔(例如動畫,大小,彈丸,升級)是對象,我需要嵌套信息,如何獲取信息? 無需再次查詢?

所有文檔和子文檔都是JavaScript中的對象。 只是在調用util.inspect格式化文檔以進行輸出時, console.log使用默認深度2。 您可以自己調用util.inspect來輸出文檔的所有級別:

var util = require('util');

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

使用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()將返回對象,並且您可能擁有的任何虛擬字段或特殊吸氣劑將被忽略。

JohnnyHK是正確的,但是如果您只想注銷JSON,則更簡單的方法是

console.log(tower.toJSON());

您可以查看我對Rodrigo的評論,以了解其工作原理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM