2017-02-22 14 views
0

私は現在beacon_logsという名前の文書を持っています。私はビーコンの範囲に入るたびにログを記録します。couchDBビューで配列キーの一部を照会

{ 
    "_id": "00198cd8f0fc510dbad06bf24e93f55b", 
    "_rev": "1-e90f025935847b0412923e4ba472cf2a", 
    "device": "gwen", 
    "beaconUUID": "123", 
    "distance": "0.0", 
    "timestamp": 1487443924 
}, 
{ 
    "_id": "00198cd8f0fc510dbad06bf24e93f55c", 
    "_rev": "1-e90f025935847b0412923e4ba472cf2a", 
    "device": "gwen", 
    "beaconUUID": "123", 
    "distance": "0.1", 
    "timestamp": 1487443925 
}, 
{ 
    "_id": "01ab15fd3a1c7c37ba147be8c56fe389", 
    "_rev": "1-587035fb7a71962c21f91b86aca56a77", 
    "device": "gwen", 
    "beaconUUID": "456", 
    "distance": "0.87", 
    "timestamp": 1487031602 
}, 
{ 
    "_id": "01ab15fd3a1c7c37ba147be8c56fe388", 
    "_rev": "1-587035fb7a71962c21f91b86aca56a77", 
    "device": "gwen", 
    "beaconUUID": "456", 
    "distance": "0.87", 
    "timestamp": 1487031603 
} 

そして、このビュー:データはこれに似ています

function (doc) { 
    emit([doc.beaconUUID,doc.timestamp], doc); 
} 

私が欲しいのは唯一の特定のbeaconuuid(i.e.123)の全てを取得し、タイムスタンプによってもソートそれを持って取得することです。これは私が書いたクエリです:

*DB_NAME*/_design/*DDOC_NAME*/_view/*VIEW_NAME*?descending=false&startkey=["123",999999999]&endkey=["123",0] 

しかし、これは他のbeaconUUIDも含むかなりランダムな結果を返します。

私はこの非常に長い説明のために私の質問です:キーが配列の場合、配列の値の1に対してクエリを行う方法はありますか?

*DB_NAME*/_design/*DDOC_NAME*/_view/*VIEW_NAME*?descending=false&key[0]="123" 

もしそうでなければ誰でも回避策を推薦できますか?

答えて

1

を参照してください並べ替えの定義に含まれて不思議に思っている

function (doc) { 
    if (doc.beaconUUID) { 
    emit([doc.beaconUUID,doc.timestamp], doc); 
    } 
} 

私はこれらのクエリーで正しい回答を得ることができた:

時系列タイムスタンプ順:
*DB_NAME*/_design/*DDOC_NAME*/_view/*VIEW_NAME*?startkey=["123",0]&endkey=["123",{}]

逆時系列タイムスタンプ順:
*DB_NAME*/_design/*DDOC_NAME*/_view/*VIEW_NAME*?startkey=["123",{}]&endkey=["123",0]&descending=true

+0

ああ!私は一日中この答えを見つけるために勉強しました!ありがとうございました! –

0

Cloudant queryを使用したことがありますか?

インデックス

POST /$DATABASE/_index HTTP/1.1 

{ 
"index": { 
    "fields": [ 
    "beaconUUID", 
    "timestamp" 
    ] 
}, 
"type": "json" 
} 

を定義...とBODY

{ 
"selector": { 
    "beaconUUID": { 
    "$eq": "123" 
    } 
}, 
"sort": [ 
    "beaconUUID", 
    "timestamp" 
] 
} 

P.S.にクエリを渡すこと

POST /$DATABASE/_find HTTP/1.1 

を問い合わせます場合は、あなたはなぜbeaconUUIDこのビューを使用してCloudant: How to create an index for "Sort" function?

+0

私はcloudantの推薦でPHP-on-couchライブラリを使用していますが、それを使用して_findを呼び出す方法は完全にはわかりません。 –

+0

https://github.com/PHP-on-Couch/PHP-on-Couch/blob/master/doc/couch_client_mango.mdをご覧ください。 – ptitzler

0

この質問の代替案を探している他の人のために、ここに_findに関する私の発見があります。PHP・オン・ソファー

介しPHP CURL介し

を_find使用

_findクエリ

{ 
    'selector': { 
     'beaconUUID':'123' 
    }, 
    'fields': ['beaconUUID', 'timestamp'], 
    'sort': [ 
     {'beaconUUID':'desc'}, 
     {'timestamp':'desc'} 
    ] 
} 

$url = 'https://'.<ACCOUNTNAME>.'.cloudant.com/<DB_NAME>/_find'; 
$fields = array(
       'selector' => array('beaconUUID'=>"123"), 
       'fields' => array("beaconUUID", 
            "timestamp"), 
       'sort' => array(array("beaconUUID"=>"desc"), 
           array("timestamp"=>"desc")) 
      ); 
$fields_string = json_encode($fields); 
$ch = curl_init(); 

    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_USERPWD, <APIKEY> . ":" . <APIPASSWORD>);  
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     'Content-type: application/json', 
     'Accept: */*' 
    )); 

    $output=curl_exec($ch); 

    curl_close($ch); 
    echo $output; 

require_once 'PHP-on-Couch/Couch.php'; require_once 'PHP-on-Couch/CouchAdmin.php'; require_once 'PHP-on-Couch/CouchClient.php'; require_once 'PHP-on-Couch/CouchDocument.php'; require_once 'PHP-on-Couch/CouchReplicator.php'; require_once 'PHP-on-Couch/Exceptions/CouchException.php'; require_once 'PHP-on-Couch/Exceptions/CouchConflictException.php'; require_once 'PHP-on-Couch/Exceptions/CouchExpectationException.php'; require_once 'PHP-on-Couch/Exceptions/CouchForbiddenException.php'; require_once 'PHP-on-Couch/Exceptions/CouchNoResponseException.php'; require_once 'PHP-on-Couch/Exceptions/CouchNotFoundException.php'; require_once 'PHP-on-Couch/Exceptions/CouchUnauthorizedException.php'; use PHPOnCouch\Couch, PHPOnCouch\CouchAdmin, PHPOnCouch\CouchClient; $fullurl = 'http://'.<APIKEY>.':'.<APIPASSWORD>.'@'.<ACCOUNTNAME>.'.cloudant.com'; $client = new CouchClient($fullurl,$DATABASE); $sort = [ ["beaconUUID" => 'desc'], ["timestamp" => 'desc'] ]; $fields = ['beaconUUID', 'timestamp']; $find = ['beaconUUID'=>"123"]; $docs = $client->skip(10)->limit(30)->sort($sort)->fields($fields)->find($find); echo json_encode($docs); 
関連する問題