2016-12-14 3 views
0

個人情報に応じてコレクションの投稿からキューを公開する必要があります。しかし、私はこれをどうやって得るのか分かりません。私は私が実現しようとするものをメインコンセプトのドローマインドマップをしました:投稿を公開するにはプライバシーにかかっていますか?

enter image description here

入力:

var currentUser = "Andrey"; 

Events.find(); 

出力:

[ 
{ 
    //it's going to output, becouse I've created this post 
    "_id" : "1", 
    "createdBy" : "Andrey", 
    "private" : true, 
    "title" : "", 
    "text": "", 
    "members" : [ 
     "Sheldon", "Mike" 
    ] 
}, 
{ 
    //it's going to output, becouse this post not private 
    "_id" : "2", 
    "createdBy" : "Sheldon", 
    "private" : false, 
    "title" : "", 
    "members" : [] 
}, 
{ 
    //it's going to output, becouse I'm one of members' 
    "_id" : "3", 
    "createdBy" : "Mike", 
    "private" : true, 
    "title" : "", 
    "text": "", 
    "members" : [ 
     "Andrey" 
    ] 
}, 
{ 
    //it's NOT going to output, becouse it's private post, I'm not the member or author 
    "_id" : "4", 
    "createdBy" : "Ana", 
    "private" : true, 
    "title" : "", 
    "text": "", 
    "members" : [ 
     "Sheldon" 
    ] 
}, 
] 

期待される結果:

[ 
{ 
    "_id" : "1", 
    "createdBy" : "Andrey", 
    "private" : true, 
    "title" : "", 
    "text": "", 
    "members" : [ 
     "Sheldon", "Mike" 
    ] 
}, 
{ 
    "_id" : "2", 
    "createdBy" : "Sheldon", 
    "private" : false, 
    "title" : "", 
    "text": "", 
    "members" : [] 
}, 
{ 
    "_id" : "3", 
    "createdBy" : "Mike", 
    "private" : true, 
    "title" : "", 
    "text": "", 
    "members" : [ 
     "Andrey" 
    ] 
} 
] 

しかし、このアイデアは間違っている可能性があります。別の方法がありますか?

答えて

2

これは適切なアプローチであるかどうかはわかりませんが、この問題に直面した場合はおそらく私はそれを試してみるでしょう。 (ちなみに私は名前の代わりにはuserIdを使用すると思います。あなたは、このコメントを無視してください、あなたの目的を説明するために名前を使用した場合)限り私が覚えているよう

を、あなたはその

のように複数のクエリ結果を返すことができます
return [ 
     Result1, 
     Result2, 
     ] 

一般公開の投稿については、私が推測する必要はありません。 private: falseで返すだけで十分です。私立の場合

、私はパラメータとしてのuserIdを使用し、この複合出版試してみた:

Meteor.publish('posts', function postPublication(userId) { 

    return [ 
    Posts.find({ 
    $and: [{ 
     $or: [ 
     {_id: userId}, 
     {memberId: {$in: userId}} 
     ]}, 
     {private: {$eq: true}} 
    ]}), // => should return private posts created or commented by member 
    Posts.find({private: {$eq: false}}) // => should return public ones 
    ]; 
} 

はその後のuserId

Meteor.subscribe('posts', userId); 
+0

大変!私はそれがあなたの例のように、$と$またはステートメントで行うことがこの問題の唯一の決定を持っていると思います。私はそれと一緒に実験をするために一日中過ごす、そして今私は期待される結果を得る。また、ユーザーIDについては、IDを使用しています。たとえば、与えられています。ありがとうございました! –

0

私は、このタスクを解決する方法このコードでサブスクリプションを行うが、 $または$と。しかし、それが最善の解決策であるかどうかはわかりません。しかし、私は期待される結果を得る。

Meteor.publish('posts', function(currentUser) { 
selector = { 
       $or : [ 
        { $and : [ {'private': true, 'members': currentUser} ] }, 
        { $and : [ {'private': true, 'author': currentUser} ] }, 
        { $and : [ {'private': false, 'author': currentUser} ] }, 
        { $and : [ {'private': undefined} ] }, 
        { $and : [ {'private': false} ] }, 

       ] 
      } 
return Posts.find(selector); 
}); 
関連する問題