2017-10-02 11 views
0

IBM CloudandデータベースのMap Reduceプロセスを使用して24時間以内に作成されたドキュメントの数をカウントしたいと思います。ここに私の地図-削減コードです:削減の段階ではクエリークラウドクエリーを使用して24時間以内に作成されたドキュメントの数。

function (doc) { 
    docTime = (new Date(doc.created_at)).getTime(); 
    currentTime = (new Date()).getTime(); 
    if ((86400000 - (currentTime - docTime)) > 0) { 
      emit(doc.deviceID, 1); 
    } 
} 

、私は、ドキュメントの合計を取得するには、カウント機能を使用していました。ただし、値currentTimeは初めてMap-Reduceを構築したもので、クエリごとに更新されていないようです。

この問題を克服するための提案があれば素晴らしいことでしょう。

ありがとうございました。

+0

同様の問題がありました...クラウドに保存していたJSONのドキュメントに作成された時間を追加しました。それに基づいてビューを作成しました。 –

答えて

2

ここではいくつかのオプションがあると思いますが、私はビューもその1つだとは思わないのです。私は、ビューは挿入/更新時にのみ計算されると信じています。

最初のオプションは、Cloudant Queryを使用することです。これに伴う問題は、あなたがをループするために持っているすべてのエントリをカウントしますです

"selector": { 
    "$and": [ 
     {"created_at" : { "$gt": 1506874127 }}, 
     {"created_at": { "$lt": 1506960651 }} 
    ] 
} 

:あなたのcreated_atフィールドにインデックスを作成し、次のセレクタを使用することができます。代替経路は、Cloudant Searchを使用することです。次のようなCloudantで検索インデックスを作成します。

{ 
    "_id": "_design/allDocs", 
    "views": {}, 
    "language": "javascript", 
    "indexes": { 
    "byCreatedAt": { 
     "analyzer": "standard", 
     "index": "function (doc) {\n if (doc.created_at && doc.device_id) {\n index(\"created_at\", doc.created_at);\n index(\"device_id\", doc.device_id);\n }\n}" 
    } 
    } 
} 

Cloudantダッシュボード使用する場合は、次のように対応しています

設計ドキュメント= allDocs

インデックス名= byCreatedAt

インデックスを関数=

function (doc) { 
    if (doc.created_at && doc.device_id) { 
    index("created_at", doc.created_at); 
    index("device_id", doc.device_id); 
    } 
} 

次に、範囲を使用して検索を実行することができます。範囲は24時間前から今すぐになります。group_field=device_idを指定すると、結果がデバイスIDでグループ化されます。例えば、

https://<YOUR_INSTANCE>.cloudant.com/<YOUR_DB>/_design/allDocs/_search/byCreatedAt?q=created_at%3A[1506874127%20TO%201506960651]&group_field=device_id&limit=1

はここで検索クエリがある:私はUNIXタイムスタンプを使用しています

created_at:[1506874127 TO 1506960651]

。あなたは、私が信じる日付の文字列を使うこともできます。また、制限を1に設定します。これは、合計カウントのみを必要とするため、各グループの最初のエントリのみを返します(グループクエリでは制限= 0は許可されません)。ここではサンプルの結果は次のとおりです。

{ 
    "total_rows":3, 
    "groups":[ 
    { 
     "by":"1", 
     "total_rows":2, 
     "rows":[ 
     { 
      "id":"263a81ea76528dead3a4185df3676f62", 
      "order":[ 
      1.0, 
      0 
      ], 
      "fields":{ 

      } 
     } 
     ] 
    }, 
    { 
     "by":"2", 
     "total_rows":1, 
     "rows":[ 
     { 
      "id":"d857ac5c58eebde4c21ffdcf3e0fd321", 
      "order":[ 
      1.0, 
      0 
      ], 
      "fields":{ 

      } 
     } 
     ] 
    } 
    ] 
} 

byフィールドには、デバイスIDです。

+0

コメントありがとうございました。グループ化操作のように、各デバイスのドキュメント数(ドキュメント内のdeviceIDによって識別される)をカウントする場合は、何を設定する必要がありますか?もう一度ありがとうございました –

+0

申し訳ありませんが、私はあなたの質問のグループ分けを逃した。改訂版の回答をご覧ください。注:検索インデックスとクエリの両方が変更されています。 – markwatsonatx

+0

ご協力いただきありがとうございます。 cloud_検索のdevice_idでグループ化する場合、Cloudantは要求ごとに10グループしか制限しません。つまり、データベースに100台のデバイスがある場合です。これは不可能であるか、またはループクエリーに再度つながります。あなたはそれについて何か提案していますか?あなたの助けをありがとうございます –

関連する問題