2016-12-02 11 views
0

Node.jsからcouchBaseでユーザー固有のビューを作成しようとしています。ここで私は、設計ドキュメントdesign_usersはCouchbaseの上に作成されますが、次のカールcouchBaseでビューを作成するときにjsonで入力変数をキーとして設定する方法

curl -H "Content-Type: application/json" -X POST -d '{"userId": "uidam231"}' http://localhost:3000/todo/id 

を実行するには

app.post("/todo/:id", function(req, res){ 
console.log("hey" + req.body.userId) 
    baseview.setDesign('design_users', { 
    "$req.body.userId": { 
     'map': "function (doc, meta) { if(doc.toUserName == req.body.userId) {emit(doc.status, doc.title);}}" 
     } 
    }, 
    function(err, result){ 
     if (err != null) console.log(err); 
     else res.send(result) 
    } 
); 
}) 

を持っているコードは、予想されるビュー(uidam231は)ないです。コンソールにエラーはありません。

変数req.body.userIdがjsonに割り当てられている可能性が考えられます。ビュー名( "$ req.body.userId":)とフィルタ条件(doc.toUserName == req.body.userId)の両方に渡された変数が必要であることに注意してください。

お願いします。

答えて

1

map()およびreduce()はデータをクエリするのではなく、インデックスを作成し、バケット内のデータのマテリアライズドビューを作成し、後で実行できるため、変数をビューのマップ関数に渡すことはできませんフィルタリング、レンジング、並べ替えなどが含まれますが、ビルド時(つまりマップが実行されたとき)にそのインデックスに配置することを選択したキーに基づいています。シンプルにすると、データセット全体に対して一度マップ関数が実行され、新しい/変更されたドキュメントごとにインデックスが更新されます。このため、クエリのパラメータを渡したり使用したりすることができない場合や、インデックスビルド時に各ドキュメントに対して値が1回だけ評価されるため、クエリー時間ではないため、new Date()またはMath.random()の無意味な使用が発生することがあります。あなたがあなたのケースで何をすべき

は、次のようにマップ機能を構築することです:

function (doc, meta) { 
    emit(doc.toUserName, [doc.status, doc.title]); 
} 

これは、ユーザー名がキー、および状況で、タイトルが値であるインデックスを表示与えます。そこで、key=引数を使用してビューを照会し、そこにユーザーIDを渡すことができます。

詳細情報:

  1. Querying Data with Views
  2. MapReduce Views
+0

こんにちは@avsej:私はこの部分を理解しています。私が達成しようとしているのはこれです。新しいユーザー登録について、(ユーザー固有の)ビューをcouchBaseに追加したいと思います。私はまた、各ユーザーに基づいてビューを追加するスクリプトを実行することができたと思います。基本的に、これはクエリではありません。マップ関数が数値や文字列などの特定の値をチェックするビューです。 – user1384205

+0

この場合、ユーザ名はリテラルとして 'req.body.userId'の代わりに' map() '関数本体に置き換えなければなりません。ビュー名。しかし、あなたは、単一のビューを更新/追加することはできないことを覚えておく必要があります。毎回デザイン文書全体を上書きする必要があります。おそらくN1QLがあなたの問題を解決するだろうか? – avsej

+0

NiQLはビューよりもレイテンシが高いようです。私はクライアント上のcouchbaseライトで緩和する予定です。私はまだ、上記の問題の文字通りの部分に変換することはできません。 – user1384205

関連する問題