CouchDb过滤并在一个视图中排序

时间:2015-08-18 12:14:44

标签: sorting couchdb

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

SELECT * FROM table WHERE date > "2015-01-01" AND date < "2015-08-01" ORDER BY name/date/email ASC/DESC

我无法弄清楚是否可以针对所有这些问题使用一种视图。 这是我的地图示例:

function(doc) {
    emit(
        [doc.date, doc.name, doc.email],
        {
            email:doc.email,
            name:doc.name,
            date:doc.date,
        }
    );
}

我尝试使用startkey和endkey过滤数据,但我不确定如何以这种方式对数据进行排序:

startkey=["2015-01-01"]&endkey=["2015-08-01"]

我可以使用一个视图吗?或者我必须使用键顺序创建一些视图,具体取决于我当前的订单字段:[doc.date,doc.name,doc.email],[doc.name,doc.date,doc.email]等?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

你可以用两种方式使用列表函数:

1。)Couch-View按日期排序,您按e-amil =&gt;排序但是请。请注意,您必须拥有内存中的所有项目才能通过电子邮件进行此类排序(即只有在结果集较小时才能执行此操作)

2。)Couch-View是通过电子邮件订购的,列表功能在日期范围之外全部丢失(只有当整体列表很小时才能这样做 - 所以这个很可能是坏的)

可能#1可以帮助你

答案 1 :(得分:1)

正如塞巴斯蒂安所说,你需要使用列表功能在Couch中执行此操作。

如果你考虑一下,这就是MySQL正在做的事情。它的查询优化器将为您的表选择一个索引,它将扫描该索引的范围,将其需要的内容加载到内存中,并执行查询逻辑。

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

所以你的选择是塞巴斯蒂安所强调的:

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

  2. 按电子邮件等排序的视图,列表功能会过滤掉日期范围之外的所有内容。

  3. 您选择哪一个取决于您的数据和架构。

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

    如果你需要这个完成服务器端,你需要你的列表函数将每个匹配的文档加载到一个数组中,然后对它进行排序,然后JSON将其序列化。如果有太多匹配的文件,它们甚至不适合记忆或需要长时间排序,这显然会分崩离析。

    选项2扫描预订文档,仅发送与日期匹配的文档。完成此操作可以避免将所有内容加载到内存中。 OTOH它可能扫描太多文件,摧毁你的磁盘IO。

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