2016-08-14 196 views
1

大家好我有一個問題,從數據庫只允許由用戶獲取字段。 所以我的模式是:根據權限字段選擇字段

var profileSchema = mongoose.Schema({ 
    authId: {type: Schema.Types.ObjectId, ref: 'Auth'}, 
    fname: String, 
    lname: String, 
    am: Number, 
    email: String, 
    location: String, 
    languages: [String], 
    birth_date: { 
     type: Date, 
     default: Date.now 
    }, 
    reg_date: { 
     type: Date, 
     default: Date.now 
    }, 
    last_log: { 
     type: Date, 
     default: Date.now 
    }, 
    permissions: { 
     location: {type: Boolean,Default:true}, 
     birth_date: {type: Boolean,Default:true}, 
     email: {type: Boolean,Default:true}, 
     am: {type: Boolean,Default:true}, 
     subjects: {type: Boolean,Default:true}, 
     files: {type: Boolean,Default:true}, 
     posts: {type: Boolean,Default:true} 
    }, 
    ip: String, 
    subjects: [{type: Schema.Types.ObjectId, ref: 'Subject'}], 
    files: [{type: Schema.Types.ObjectId, ref: 'FileIndex'}], 
    posts: [{type: Schema.Types.ObjectId, ref: 'Post'}], 
    notifications: [{type: Schema.Types.ObjectId, ref: 'Notifications'}] 
}); 

,我試圖讓僅在許可領域擁有真正的,這意味着它允許領域。所以我正在運行以下查詢:

database.Profile.findOne({_id: req.params.id}).exec(function (err, profile) { 
    console.log(profile); 
    res.send(profile); 
}); 

如何僅選擇允許的字段?

回答

1

試試這個,這,可能會得到你想要的東西:

database.Profile.findOne({_id: req.params.id},{location:$.permissions.location , birth_date:$.permissions.birth_date, email:$.permissions.email, am:$.permissions.am, subjects:$.permissions.subjects, files:$.permissions.files, posts:$.permissions.posts}).exec(function (err, profile) { 
    console.log(profile); 
    res.send(profile); 
}); 
1

你可以做一個查詢與鏈接,因爲文件從查詢啓用了精益選項返回lean()方法是純JavaScript對象,不MongooseDocuments和操縱通過由權限決定除去鍵返回的對象領域的物體:

Object.filter = function(obj, predicate) { 
    var result = {}, key; 
    for (key in obj) { 
     if (obj.hasOwnProperty(key) && !predicate(obj[key])) { 
      result[key] = obj[key]; 
     } 
    } 
    return result; 
}; 

database.Profile.findOne({_id: req.params.id}).lean().exec(function (err, doc) { 
    if (err) return handleError(err); 
    console.log(doc); 
    console.log(doc.permissions); 
    var filtered = Object.filter(doc.permissions, 
     function (key){ return doc.permissions[key]; } 
    ); 
    console.log(filtered); 
    res.send(filtered); 
}); 

使用貓鼬投影select()方法的另一種替代方法是做兩個查詢;第一個將返回整個文檔,並在未來將查詢相同的文檔,但基於項目的權限對象的字段的字段:

下面顯示了這一點:

database.Profile.findOne({_id: req.params.id}).lean().exec(function (err, doc) { 
    console.log(doc); 
    console.log(doc.permissions); 
    var projection = Object.keys(doc.permissions) 
          .filter(function (key){ return doc.permissions[key]; }) 
          .join(' '); 
    console.log(projection); 
    database.Profile.findOne({_id: req.params.id}) 
     .select(projection) 
     .exec(function (err, profile) { 
      if (err) return handleError(err); 
      res.send(profile); 
     });  
}); 
+1

我的第二個解決方案解決它,你在我發佈這個問題後提出了這個問題,但是這個需要兩個查詢。我沒有檢查第一個問題,因爲'ravi shankar'的第一個答案很好,謝謝。 –

+0

@AlexisPavlidis不用擔心,如果您事先不知道權限密鑰,則不是最佳解決方案之一,而只是一種替代方案。總的來說,我認爲拉維的回答就足夠了,因此+1。 – chridam