2016-08-26 15 views
0

こんにちは、私は次のフィールドでCloudantドキュメントを持っていると仮定すると、次のユースケースを持っている:Cloudant検索インデックスの選択クエリ

{ 
    public: false, // Visibility of the doc 
    permissions: [1,2,3] // List of user IDs that are allowed view access to the doc 
} 

(許可フィールドに記載されているように)だけが特権ユーザーがそれにアクセスを持っていますか、 public(public:true)の場合、すべてのユーザーがアクセスできます。

私の問題は、現在のユーザーがアクセスできるすべてのドキュメントを検索するための検索インデックスを作成しようとしているときに発生します。

function (doc) { 
    if (!doc.public) { 
     doc.permissions.forEach(function(entry) {  
      index("user_id", parseInt(entry)); 
     }); 
    } else { 
     index("user_id", ???); // If its public document, how should I index it? 
    } 
} 

それはfalseに公共のセットを持っていますが、私の検索インデックスをtrueに公共のセットでそれらの文書を返すことに失敗したドキュメントに適しています:私の検索インデックスは次のようになります。私の検索クエリは次のようになります:

q=user_id:1 

私は実際にコントローラレイヤーではなく、これをCloudantレイヤーに実装する必要があるので、どのような提案もあります。

答えて

1

あなたの説明によると、私はビューの方がはるかに状況に適応しています。クエリの検索が絶対に必要な場合は、別の解決策を見つけようとすることができます。私は、ユーザーに許可された文書を取得するために照会するだろうというとき、私は単にビューを照会でしょう、そして、

function(doc) { 
    if (doc.public) //If it's public, we will emit the magic ID *. Feel free to use any other key that will be unique. 
     emit('*'); 
    else if (doc.permissions && Array.isArray(doc.permissions)) //We valid the permission property 
     for (var i in doc.permissions) 
      if (doc.permissions[i]) 
       emit(doc.permissions[i]); 
} 

だから、最初にすべての、私はこのようなマッピング機能を持つようなビューを行うだろう_view/byUserId?keys=['myUserId','*']

各行について、idプロパティで許可されているドキュメントのIDを持つことになります。

+0

提案をいただきありがとうございます。私はこの目的のためにビューを使用する場合、タイムスタンプなどのソート機能をどのように統合するのですか? – Lee

+0

このキーでは、キー配列を発行できます。例:emit(['*'、(new Date())。getTime()]);次に、ソートを制御するには、* descending *クエリパラメータを使用する必要があります。通常、私が間違っている場合は私を修正し、それは最初のキーと秒の両方を並べ替えます。最後に、主キー(ドキュメントID)を最初にソートします。次に、同じキーを持つすべてのドキュメントについて、2番目のキー(タイムスタンプ)をソートする必要があります。 –

関連する問題