在Couch DB的情况下,如何使用最佳范围查询和Mongo Expression获取文档?

时间:2018-07-03 17:28:07

标签: php couchdb

假设我的数据库中有200个名为“ person”的文档,并且我想从60到70范围内获取文档,那么在CouchDB的情况下该怎么办,现在我正在使用mongo表达式,并使用'skip'参数范围查询,但是一旦跳过大小增加,查询执行时间也会增加,“ skip”参数是否还有其他选择? 在RDBMS中,我们可以使用下限和上限轻松地获取数据,但是如果使用CouchDB,我该怎么办?

这是我的查询

$getDocs = '{
    "selector": {
        "name": {"$ne": "null"}
    },
    "fields": ["_id", "_rev", "name", "email" ],
    "sort": [{"name": "asc" }],
    "limit": 10,
    "skip": '.$skip.'
}';

我正在尝试使用Mango Expression对PHP和CouchDB进行分页,并且每页显示10条记录。

See the image,当您单击在第7页上的URL中看到的图像时,这意味着我需要提取61到70之间的文档,为此,我使用上面的查询。在上面的查询中,我传递的限制等于10,因为我只需要在每页上显示10个文档,而且由于我在第7页上,所以我正在使用skip来跳过60个文档。所以问题就出在这里,页码增加,要跳过的文档数量也会增加,因此查询的执行时间也会增加,假设如果我在第1500页上,那么在第1500页上,我需要显示15001到15010之间的文档,为此我需要跳过15000个文档并跳过如此数量的文档大约需要7秒钟的时间,这是相当高的。那么有什么办法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

对于芒果查询,您必须使用书签。可以找到完整的文档here

预览:

  

芒果查询支持通过书签字段进行分页。每个_find响应都包含一个书签-CouchDB使用该令牌来确定在进行后续查询时从何处恢复。要获取下一组查询结果,请将上一个响应中收到的书签添加到下一个请求中。记住要保持选择器不变,否则您将收到意想不到的结果。要向后分页,可以使用上一个书签返回上一组结果。

     

请注意,书签的存在并不能保证会有更多结果。您可以通过将返回的结果数与请求的页面大小进行比较来测试是否已到达结果集的末尾-如果返回的结果<限制,则没有更多内容。