2012-06-22 74 views
45

我有以下簡單瑪:如何排除從文檔的某些字段

var userSchema = new Schema({ 
    name : String, 
    age: Number, 
    _creator: Schema.ObjectId 
    }); 

    var User = mongoose.model('User',userSchema); 

我想要做的就是創建新的文檔,並且返回到客戶端,但我要排除的「創造者」字段從一個:

app.post('/example.json', function (req, res) { 
    var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'}); 
    user.save(function (err) { 
     if (err) throw err; 

     res.json(200, {user: user});  // how to exclude the _creator field? 
    }); 
}); 

最後我想發送的新創建的用戶,而不_creator領域:

{ 
    name: 'John', 
    age: 45 
} 

是否有可能沒有額外的查找請求貓鼬?

PS:這是最好的

+0

創建一個新的JSON對象不說,現場並返回。有什麼問題? –

回答

62

另一種方式來處理在模式級別上這是爲了覆蓋模型的JSON。

UserSchema.methods.toJSON = function() { 
    var obj = this.toObject() 
    delete obj.passwordHash 
    return obj 
} 

我遇到了這個問題,尋找一種方式,從我提供給客戶端,並select: false打破了我verifyPassword功能,因爲它沒有從數據庫中檢索值在所有的JSON排除密碼哈希。

+0

謝謝!這是我需要! – Erik

+6

嘗試使用 UserSchema.set( '的toJSON',{ \t \t變換:功能(文件,RET,選項){ \t \t \t刪除ret.password; \t \t \t返回RET; \t \t} \t} ); – Xerri

+0

只要謹防任何人複製這段代碼,obj應該在它之前有一個var語句,否則它會泄漏一個全局引用。 –

6

,使其可以調用toObject()的文件,將其轉換爲純JS對象,您可以自由修改:

​​
+0

謝謝你的回答,我可以定義一個永遠不會返回Schema級別的字段嗎? – Erik

+4

您可以通過在字段的定義中包含'select:false'來默認隱藏模式字段。 – JohnnyHK

+0

這比改變所有對象的默認序列化要好得多。 –

17

當我試圖找到與pymongo類似的答案時,遇到您的問題。事實證明,在mongo shell中,使用find()函數調用,可以傳遞第二個參數,指定結果文檔的外觀。當您傳遞屬性值爲0的字典時,您將排除此查詢中出現的所有文檔中的此字段。

在你的情況,例如,查詢就會像:

db.user.find({an_attr: a_value}, {_creator: 0}); 

這將排除_creator參數爲您服務。

在pymongo中,find()函數幾乎相同。不知道它如何翻譯爲貓鼬,但。相比之下,手動刪除字段,我認爲這是一個更好的解決方案。

希望它有幫助。

+0

儘管其他可能工作,這似乎是對我來說正確的答案。爲我工作。 – abritez

+0

這可能在某些情況下有效,但不是大多數,因爲即使您不想顯示該字段,您也希望它在後端進行操作。這個解決方案和其他許多類似的問題是,從未從數據庫中檢索有問題的字段。如果你有其他的計算或虛擬領域取決於它,他們將不會被正確設置。 – jfmatt

+2

繞過貓鼬似乎是目前在貓鼬做事情的推薦方式。讓我們想一想,如果貓鼬能夠完成任務.. – nottinhill

51

的記錄方式是

UserSchema.set('toJSON', { 
    transform: function(doc, ret, options) { 
     delete ret.password; 
     return ret; 
    } 
}); 

更新 - 你可能想使用白名單:

UserSchema.set('toJSON', { 
    transform: function(doc, ret, options) { 
     var retJson = { 
      email: ret.email, 
      registered: ret.registered, 
      modified: ret.modified 
     }; 
     return retJson; 
    } 
}); 
+7

或者,如果你已經強調/ lodash,您可以用'_.pick' UserSchema.set( '的toJSON',{ 變換:函數(DOC,RET,期權){ 回報_.pick(RET, 'email','registered','modified') } }) –

+0

@xerri - 這是記錄在哪裏?我看到toJSON,但無法找到變換 –

+0

@xerri - 發現它,只是感到困惑,因爲文檔位於toObject而不是JSON ==> http://mongoosejs.com/docs/api.html#document_Document-toObject –

9

我會用lodash公用事業.pick().omit()

var _ = require('lodash'); 

app.post('/example.json', function (req, res) { 
    var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'}); 
    user.save(function (err) { 
     if (err) throw err; 
     // Only get name and age properties 
     var userFiltered = _.pick(user.toObject(), ['name', 'age']); 
     res.json(200, {user: user}); 
    }); 
}); 

另一個例子是你ld是:

var _ = require('lodash'); 

app.post('/example.json', function (req, res) { 
    var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'}); 
    user.save(function (err) { 
     if (err) throw err; 
     // Remove _creator property 
     var userFiltered = _.omit(user.toObject(), ['_creator']); 
     res.json(200, {user: user}); 
    }); 
}); 
1

我正在使用Mongoosemask,我非常滿意它。

它支持隱藏和根據您的需要

https://github.com/mccormicka/mongoosemask

VAR maskedModel = mongomask.mask(模型,[ '名', '年齡'])與其他的名字曝光性能; //你完成了。

相關問題