2016-08-14 18 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のオブジェクトです、

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); 
}); 

:フィールドがない MongooseDocumentsと権限によって決定されるようにキーを削除することによって返されたオブジェクトを操作するオブジェクト

Mongooseの投影select()メソッドを使用する別の方法は、2つのクエリを作成することです。最初のものは文書全体を返し、次は同じ文書を照会が、権限に基づいてフィールドがフィールドオブジェクトを投影します:

を以下に示し、この:私は第二の溶液とそれを解決する

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

をお私は質問を投稿した直後に提案しましたが、この質問には2つのクエリが必要です。最初の回答は 'ravi shankar'からうまくいくので、最初のチェックはしませんでした。 –

+0

@AlexisPavlidis最高の解決策の1つではなく、あらかじめアクセス許可キーがわからない場合には、代わりの方法です。全体的に私はラヴィの答えが+1で十分だと思う。 – chridam

関連する問題