2017-02-22 91 views
0

我目前有一个名为beacon_logs的文档,每次我走进一个信标范围时都会记录。数据类似于此:在沙发数据库查询部分数据库查看

{ 
    "_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以及。

我对这个非常冗长的解释的问题是:假设键是一个数组,是否有任何方法来查询数组的值,例如:

*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

啊!我花了整整一天的时间学习_find来找到答案!谢谢! –

0

您是否考虑过使用Cloudant query

定义的索引

POST /$DATABASE/_index HTTP/1.1 

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

...和查询它

POST /$DATABASE/_find HTTP/1.1 

传递查询在身体

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

附:如果你想知道为什么beaconUUID包括在排序定义使用这种观点是指Cloudant: How to create an index for "Sort" function?

+0

我正在使用PHP-on-couch库,正如cloudant所推荐的,我并不完全清楚如何调用_find使用它! –

+0

看看https://github.com/PHP-on-Couch/PHP-on-Couch/blob/master/doc/couch_client_mango.md。 – ptitzler

0

只为寻找这个问题的替代品的其他人,这里是关于_find的调查结果。

_find查询

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

通过通过PHP卷曲

$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; 

使用_find

PHP-ON-沙发

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);