2

私は、さまざまな READ プライバシー設定を持つことができる一連のドキュメントを持っています。

  1. それらは公開できます(登録ユーザーは誰でも)それらを表示できます
  2. あなたをフォローしている人だけが見ることができます (この「フォロワー」配列は各ユーザーのドキュメントに保存されます)
  3. ドキュメントを公開した人に限定することもできます。
  4. ドキュメントを表示できる個々のユーザーに名前を付けることができるカスタム プライバシーを設定できます。さらに、ユーザーのグループがドキュメントを表示できるようにすることもできます (たとえば、20 人のユーザーを含む「サンプル グループ」というグループを作成できます。このグループにタイルの表示を許可することができます)。

MongoDB でこのスキーマを効率的に実装する方法がわかりません。このスキーマを実装するためのベスト プラクティスについての洞察が欲しいです。

4

2 に答える 2

0

私たちは、複数のアクセス レベルとマングースを使用していくつかのプロジェクトを実行してきましたが、これまでのところ、これが私たちのお気に入りの方法です。

var ACCESS_MODES = 'public followers private explicit'.split(' ');

var projectSchema = new Schema({
  access: { type: String, enum: ACCESS_MODES, required: true, default: 'public' },
  owner: { type: Schema.Types.ObjectId, ref: 'User' }]
});

次に、通常、スキーマにいくつかのカスタム アクセス メソッドを実装します。

projectSchema.statics.getByIdFor = function(user, id, done) {
  this.findOne({ _id: id }).populate('owner').exec(onFound);
  function onFound(err, project) {
    // now check 'user' against the project's access method:
    if (project.access === 'public') return done(undefined, project);
    if (project.access === 'private') {
       // ...etc, handle the logic for access at different levels
    }
    // finally, they didn't get access
    done(new Error('no permission to access this project'));
  }
};

したがって、次のようなことを実行して、安全であることを確認できます。

ProjectModel.findByIdFor(loggedinUser, req.params.projectId, onFound);

ユーザーがアクセスできるすべてのプロジェクトを検索するには:

projectSchema.statics.getForUser = function(user, done) {
  var accessible = [];
  this.find({ access: 'public' }).exec(onPublic);
  this.find({ access: 'followers' }).populate('owner').exec(onFollowers);
  this.find({ access: 'private', owner: user }).exec(onPrivate);
  this.find({ access: 'explicit' }).populate('owner').exec(onExplicit);
  // add onPublic/Followers/Private/Explicit to accessible where user is in the correct list
};
于 2013-01-05T17:51:31.757 に答える
0

使用しているドライバーを指定していないため (Javascript のタグが付けられているため、おそらくマングースを使用していますか?)、疑似コード/構造を使用してこれに答えようとします。

あなたのdocumentコレクションは次のようになります。

{
    _id,
    title,

    owner, //ref to User collection?

    access,  //'public', 'followers' etc...

    permissions[] 
}

Permission次のようになります。

{
    // one or the other
    user_id 
    group_id
}

ここで注意が必要なのは、特定のユーザーが表示できるドキュメントのリストを作成することです。
これにアプローチするには

function findDocumentsViewableByUser(userID){

    var followedBy = //populate a list of userIDs that FOLLOW the passed in userID

    var groupIDs = //populate a list of groupIDs this user is a member of

    // all documents where access = 'public'

    // all documents where access = 'followers' AND owner_id is in followedBy

    // all documents where access = 'custom' 
    // and permissions.user_id = userID OR groupIDs contains permissions.groupID
}

ユーザーおよびグループ タイプのドキュメントの構造に応じて、上記の findDocumentsViewableByUser のクエリは大幅に削減されます。
これにも Aggregation Framework を使用するのがおそらく最善でしょう。

于 2013-01-05T18:16:26.143 に答える