2012-10-14 51 views
0

我用mongoose查詢我的mongodb,但我不明白爲什麼返回的子文檔只是Object類型而不是JSON。貓鼬,子文檔是對象,而不是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] } ] } ] 

子文檔喜歡動畫,大小,彈丸,升級,是對象,我需要嵌套的信息,我怎樣才能得到這些信息?不做另一個查詢?

回答

1

所有文檔和子目錄都是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)); 
}); 
0

使用find()像你一樣會返回貓鼬文件(不JSON)製作貓鼬上查詢。您可以使用瘦()方法返回的POJO:

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

但是JohnnyHK說,它是關於控制檯日誌屬實,這將只顯示嵌套文檔爲[對象]。

更新:請注意,使用.lean()將返回對象,並且您可能擁有的任何虛擬域或特殊獲取方都將被忽略。

+0

使用['lean'](http://mongoosejs.com/docs/api.html#query_Query-lean)將返回非JSON的POJO。此外,如果您有任何虛擬字段或特殊的getter函數,它們將不會被應用,因此不會出現在POJO中。假設模式具有'getters:true'的另一種方法是將''JSON''(http://mongoosejs.com/docs/api.html#document_Document-toJSON)方法用於貓鼬文檔,如下所示:'console。日誌(tower.toJSON())' –

+0

是的。傑森真的是這樣。任何虛擬領域或獲得者將被錯過。 –

0

JohnnyHK然而正確的一個簡單的方法,如果你只是想註銷JSON是

console.log(tower.toJSON()); 

你可以看到我對羅德里戈爲什麼這個作品評論。