couchdb视图中的多个范围键

时间:2016-06-22 13:47:05

标签: http view key couchdb nosql

我一直在寻找解决方案,因为几个小时没有成功......

我只想在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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

当您指定数组作为开始/结束键时,结果将在&#34;级联&#34;中过滤。换句话说,它从左向右移动,只有当某个东西与前一个键匹配时,才会被下一个键匹配。

在这种情况下,当该文档也与Gyro_y >= 1000的第一个条件匹配时,您才会找到3000000 <= id <= 3999999

您的SQL示例并未完全转换为您在CouchDB中执行的操作。在SQL中,它会找到这两个条件,然后找到生成的行之间的交集。我会在view collation上阅读以了解CouchDB的这些内部工作原理。

要立即解决您的问题,我只需更改您发出密钥的顺序即可。通过将Gyro_y值放在第一位,您应该得到您已经描述的结果。