2015-02-10 100 views
2

所以,我一直在使用貓鼬一段時間,並且發現了一些非常奇怪的東西。如果有人能夠啓發我,那將會很棒。mongoose .find()方法返回具有不需要屬性的對象

事情是,當使用貓鼬的.find()方法,我得到的對象是充滿屬性我不知道它來自哪裏(我猜他們是內置的屬性,但無論),我只想通過屬性I .select()進行迭代。得到它了?沒有?確定...解釋更好:

我有我的架構和模型中聲明:

var mySchema = mongoose.Schema({ 
    name: String, 
    prop1: String, 
    prop2: String, 
    prop3: String 
}) 
var myModel = DB.model('myDataBase', mySchema) 

然後我想找到名稱的文件,比方說,約翰和檢索所有,但「姓名」字段,所以我去:

myModel.find({name: 'John'}, '-name', function(err, results){ 
    log(results[0]) 
} 

和log(結果[0])記錄

{ prop1: 'one', 
    prop2: 'two', 
    prop3: 'three' } 

到目前爲止,一切都很好。但問題是,現在我想遍歷這些屬性並逐一檢查,我不確定每個結果會有多少'道具',所以我想要做類似的事情:

for(var key in results[0]){ 
    log(key) 
} 

所以,我希望它會記錄'prop1','prop2'和'prop3',但不是!好吧,我得到道具1,2和3,但我也得到了很多其他的屬性和功能,如:isNew,error,_maxListeners,_doc等。不僅這些extras屬性,我還得到'name'屬性,一個我排除了選擇(它被排除在外,如第一個日誌中所示)。怪怪的?

但是等等!還有更多!我在網上搜索,發現一些人說:「夥計,當通過對象屬性迭代使用hasOwnProperty方法!」。所以我去了:

for (var key in results[0]){ 
    if (results[0].hasOwnProperty(key)) log(key) 
} 

日誌結果是一些屬性(具體:$ __,是否新款,錯誤,_maxListeners,_doc,_pres,_posts,保存_events)和犯規包括任何的道具我首先想要的。

我的問題是,我如何迭代只有道具1,2和3,排除這些,我不知道,內置屬性和我明確排除參數中的一個? (PS:我想的解決方案不涉及必須將我的對象轉換爲數組,如果可能的話)

另外,不是一個問題本身,而是好奇心,這些屬性從哪裏來?爲什麼它們出現在for循環中而不是當我登錄對象時?爲什麼我排除的屬性('-name')也出現在for循環中?如果它不識別剛纔記錄的屬性,那麼它具有哪些屬性?

感謝您的時間和幫助! 再見!

+1

.toObject()會給你一個普通的對象,也許這會有所幫助?額外的屬性是因爲你正在處理的是模型的一個實例,它不是一個普通的對象。 – 2015-02-10 22:19:08

+0

謝謝@Kevin B!仍然有很多問題,但這確實解決了我的問題!發表您的評論作爲答案,所以我可以標記它的權利? BR! – 2015-02-10 22:29:14

回答

12

或者凱文B的回答,您可以通過{lean: true}作爲一個選項:

myModel.find({name: 'John'}, '-name', {lean: true}, function(err, results){ 
    log(results[0]) 
} 

在MongoDB中,該文件只保存爲對象。當Mongoose檢索它們時,它將它們轉換成Mongoose文檔。在這樣做時,它會添加您的for循環中包含的所有密鑰。這就是允許您使用所有文檔方法的原因。如果您不使用任何這些,lean是一個不錯的選擇,因爲它跳過了整個過程,提高了查詢速度。 Potentially 3x as fast.

7

在這種情況下.toObject足以讓您的循環以您期望的方式工作。

myModel.find({name: 'John'}, '-name', function(err, results){ 
    log(results[0].toObject()) 
} 

您最初獲得額外的屬性是由於這樣的事實,results是附帶不可用正常對象的附加屬性和方法模型實例的集合。這些屬性和方法是你的循環中出現的。通過使用toObject,您將得到一個沒有所有這些附加屬性和方法的普通對象。

+0

救了我一天。謝謝 – devprashant 2017-03-12 12:25:24

+0

我的下一個問題是 - 我怎麼能欺騙這些'隱藏'的屬性,用於測試? – 2017-12-21 12:10:48

相關問題