我一直在寻找解决方案,因为几个小时没有成功......
我只想在couchdb中使用视图执行此请求:
select * from database where (id >= 3000000 AND id <= 3999999) AND gyro_y >= 1000
我试过了:
function(doc) {
if(doc.id && doc.Gyro_y){
emit([doc.id,doc.Gyro_y], null);
}
}
这是我的文档(在couchdb中记录):
{
"_id": "f97968bee9674259c75b89658b09f93c",
"_rev": "3-4e2cce33e562ae502d6416e0796fcad1",
"id": "30000002",
"DateHeure": "2016-06-16T02:08:00Z",
"Latitude": 1000,
"Longitude": 1000,
"Gyro_x": -242,
"Gyro_y": 183,
"Gyro_z": -156,
"Accel_x": -404,
"Accel_y": -2424,
"Accel_z": -14588
}
然后我按照这样的方式执行HTTP请求:
http://localhost:5984/arduino/_design/filter/_view/bygyroy?startkey=["3000000",1000]&endkey=["3999999",9999999]&include_docs=true
我得到了这个答案:
{
total_rows: 10,
offset: 8,
rows: [{
id: "f97968bee9674259c75b89658b09f93c",
key: [
"01000002",
183
],
value: null,
doc: {
_id: "f97968bee9674259c75b89658b09f93c",
_rev: "3-4e2cce33e562ae502d6416e0796fcad1",
id: "30000002",
DateHeure: "2016-06-16T02:08:00Z",
Latitude: 1000,
Longitude: 1000,
Gyro_x: -242,
Gyro_y: 183,
Gyro_z: -156,
Accel_x: -404,
Accel_y: -2424,
Accel_z: -14588
}
}
]
}
所以它适用于 id ,但它不适用于第二个键 gyro_y 。
感谢您的帮助。
答案 0 :(得分:1)
当您指定数组作为开始/结束键时,结果将在&#34;级联&#34;中过滤。换句话说,它从左向右移动,只有当某个东西与前一个键匹配时,才会被下一个键匹配。
在这种情况下,当该文档也与Gyro_y >= 1000
的第一个条件匹配时,您才会找到3000000 <= id <= 3999999
。
您的SQL示例并未完全转换为您在CouchDB中执行的操作。在SQL中,它会找到这两个条件,然后找到生成的行之间的交集。我会在view collation上阅读以了解CouchDB的这些内部工作原理。
要立即解决您的问题,我只需更改您发出密钥的顺序即可。通过将Gyro_y
值放在第一位,您应该得到您已经描述的结果。