在couchDB视图中查询部分数组键
我现在有一个名为beacon_logs的文档,每次我进入beacon的范围时,它都会记录。数据与此类似:在couchDB视图中查询部分数组键,couchdb,cloudant,nosql,Couchdb,Cloudant,Nosql,我现在有一个名为beacon_logs的文档,每次我进入beacon的范围时,它都会记录。数据与此类似: { "_id": "00198cd8f0fc510dbad06bf24e93f55b", "_rev": "1-e90f025935847b0412923e4ba472cf2a", "device": "gwen", "beaconUUID": "123", "distance": "0.0", "timestamp": 1487443924 }, { "_id"
{
"_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(即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"
如果没有,有人能推荐一种解决方法吗?您考虑过使用吗
定义索引
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
,请使用此视图参考
function (doc) {
if (doc.beaconUUID) {
emit([doc.beaconUUID,doc.timestamp], doc);
}
}
我能够通过以下问题得到正确的回答:
按时间顺序的时间戳顺序:*DB\u NAME*/\u design/*DDOC\u NAME*/\u view/*view\u NAME*?开始键=[“123”,0]&结束键=[“123”,“{}]
反向时间戳顺序:*DB_NAME*/\u design/*DDOC_NAME*/\u view/*view_NAME*?startkey=[“123”、{}]&endkey=[“123”,0]&descending=true
对于其他正在寻找这个问题替代方案的人,以下是我关于{u find}的发现
\u查找查询
{
'selector': {
'beaconUUID':'123'
},
'fields': ['beaconUUID', 'timestamp'],
'sort': [
{'beaconUUID':'desc'},
{'timestamp':'desc'}
]
}
使用_find
通过PHP CURL
$url='https://'...cloudant.com//_find';
$fields=数组(
'选择器'=>array('beaconUUID'=>“123”),
'字段'=>数组(“beaconUUID”,
“时间戳”),
“排序”=>array(array(“beaconUUID”=>desc”),
数组(“时间戳”=>“描述”))
);
$fields\u string=json\u encode($fields);
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLOPT_USERPWD,.“:”);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,“POST”);
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch,CURLOPT_HTTPHEADER,数组(
'内容类型:application/json',
'接受:/*'
));
$output=curl\u exec($ch);
卷曲关闭($ch);
echo$输出;
在沙发上通过PHP
require_once'PHP on coach/coach.PHP';
需要一次'PHP on coach/CouchAdmin.PHP';
需要_once“PHP on coach/CouchClient.PHP”;
需要一次'PHP on coach/CouchDocument.PHP';
需要一次'PHP on coach/CouchReplicator.PHP';
需要一次'PHP on coach/Exceptions/CouchException.PHP';
需要_once“PHP on coach/Exceptions/CouchConflictException.PHP”;
需要一次'PHP on coach/Exceptions/coucheexpectationexception.PHP';
需要一次'PHP on coach/Exceptions/couchorbiddenexception.PHP';
需要一次'PHP on coach/Exceptions/couchnoreresponseexception.PHP';
需要一次'PHP on coach/Exceptions/CouchNotFoundException.PHP';
需要_once“PHP on coach/Exceptions/couchunargorizedException.PHP”;
使用phponcoach\coach,
phponcoach\CouchAdmin,
phponcoach\CouchClient;
$fullurl='http://'..':'..@'...cloudant.com';
$client=newcouchclient($fullurl,$DATABASE);
$sort=[
[“beaconUUID”=>“描述”],
[“时间戳”=>“描述”]
];
$fields=['beaconUUID','timestamp'];
$find=['beaconUUID'=>“123”];
$docs=$client->skip(10)->limit(30)->sort($sort)->fields($fields)->find($find);
echo json_编码($docs);
我正在使用cloudant推荐的PHP on Coach库,但我不完全清楚如何使用它调用_find!看看。啊!我花了一整天的时间来学习这个答案!非常感谢。
$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);