Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting CouchDb在一个视图中进行筛选和排序_Sorting_Couchdb - Fatal编程技术网

Sorting CouchDb在一个视图中进行筛选和排序

Sorting CouchDb在一个视图中进行筛选和排序,sorting,couchdb,Sorting,Couchdb,我是CouchDb的新手。 我必须按日期筛选记录(日期必须介于两个值之间),并按名称或日期等对数据进行排序(这取决于用户在表中的选择)。 在MySQL中,它看起来像 SELECT * FROM table WHERE date > "2015-01-01" AND date < "2015-08-01" ORDER BY name/date/email ASC/DESC 我尝试使用startkey和endkey筛选数据,但不确定如何以这种方式对数据进行排序: startkey=["

我是CouchDb的新手。 我必须按日期筛选记录(日期必须介于两个值之间),并按名称或日期等对数据进行排序(这取决于用户在表中的选择)。 在MySQL中,它看起来像

SELECT * FROM table WHERE date > "2015-01-01" AND date < "2015-08-01" ORDER BY name/date/email ASC/DESC
我尝试使用startkey和endkey筛选数据,但不确定如何以这种方式对数据进行排序:

startkey=["2015-01-01"]&endkey=["2015-08-01"]
我可以使用一个视图吗?或者,我必须根据我当前的订单字段[doc.date、doc.name、doc.email]、[doc.name、doc.date、doc.email]等创建一些键顺序视图


谢谢你的帮助

您可以通过两种方式使用列表函数:

1.)沙发视图按日期排序,您按e-amil=>排序,但请注意。请注意,要通过电子邮件进行排序,您必须在内存中保存所有项(即,只有在结果集很小的情况下才能进行排序)

2.)沙发视图是通过电子邮件排序的,列表功能会删除日期范围之外的所有内容(您只能在整个列表很小的情况下执行此操作,因此此列表很可能不好)


可能#1可以帮助您

,正如塞巴斯蒂安所说,您需要在coach中使用list函数来实现这一点

仔细想想,MySQL就是这么做的。它的查询优化器将选择一个索引到您的表中,它将从该索引扫描一个范围,将它需要的内容加载到内存中,并执行查询逻辑

在coach中,视图是B树索引,列表函数可以实现所需的任何逻辑。它可以用来吐出HTML而不是JSON,但也可以用来过滤/排序视图的输出,最后仍然吐出JSON。它可能无法很好地扩展到数百万个文档,但MySQL也可能无法

因此,您的选择是塞巴斯蒂安强调的:

  • 查看按日期排序,查询选择日期范围,列表功能将所有内容加载到内存中,并按电子邮件等进行排序

  • 视图按电子邮件/等进行排序,列表功能过滤掉日期范围之外的所有内容

  • 您选择哪一个取决于您的数据和体系结构

    使用选项1,您可以完全跳过列表功能:一次性从视图中获取所有必要的数据(使用include_docs),并对客户端进行排序这是您通常使用沙发的方式。

    如果您需要在服务器端完成此操作,则需要使用list函数将每个匹配的文档加载到一个数组中,然后对其进行排序和JSON序列化。如果有太多匹配的文档甚至无法放入内存,或者需要很长时间才能排序,那么这显然会变成碎片

    选项2扫描预订购的文档,只发送与日期匹配的文档。正确操作避免将所有内容加载到内存中。它可能会扫描太多的文档,破坏你的磁盘IO


    如果日期范围“非常有辨别力”(通过测试的文档很少),则选项1效果最佳;否则(大多数文档通过)选项2会更好。请记住,在从磁盘加载无用文档所需的时间内(选项2),您可以在内存中对数十个文档进行排序,只要它们适合内存(选项1)。此外,索引越多,使用的磁盘空间就越多,写入速度也就越慢。

    谢谢您的回答!
    startkey=["2015-01-01"]&endkey=["2015-08-01"]