首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于权限字段选择字段

基于权限字段选择字段
EN

Stack Overflow用户
提问于 2016-08-14 16:52:26
回答 2查看 253关注 0票数 0

你好,伙计们,我在从数据库中获取用户允许的字段时遇到了问题。所以我的模式是:

代码语言:javascript
复制
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'}]
});

我试图只得到权限字段中有true的字段,这意味着它是允许的。因此,我正在运行以下查询:

代码语言:javascript
复制
database.Profile.findOne({_id: req.params.id}).exec(function (err, profile) { 
    console.log(profile);
    res.send(profile);
});

如何仅选择允许的字段?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-14 17:29:46

试试这个,也许你能得到你想要的:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-08-14 18:06:57

您可以使用链接的精益方法进行查询,因为从启用精益选项的查询返回的文档是普通的javascript对象,而不是MongooseDocuments,并通过删除权限对象字段确定的键来操作返回的对象:

代码语言:javascript
复制
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);
});

使用Mongoose的投影选择()方法的另一种方法是进行两个查询;第一个查询将返回整个文档,下一个查询将查询同一个文档,但根据权限对象字段进行字段投影:

如下所示:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38944429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档