更好地解释couchbase-lite映射函数的规则和常见错误



我是couchbase的新手,我正在尝试在我的一个Android应用程序中实现couchbase-lite。我特别纠结的是视图的概念和文档中所述的map函数的规则。

该应用程序在数据库中存储各种文档类型的文档。在一个查询中,我需要按文档类型("付款")获取整个文档以及文档属性的值(doc["approved"]=true)

因此,我会创建这样一个视图:

   com.couchbase.lite.View view = database.getView("payments");
    if (view.getMap() == null) {
        Mapper map = new Mapper() {
            @Override
            public void map(Map<String, Object> doc, Emitter emitter) {
                if (doc.get("type").equals("payments") && doc.get("approved") == true) {
                    emitter.emit(doc.get("name"), doc); 
                }
            }
        };
        view.setMap(map, "1");
    }

请注意,文档["已批准"]值可以随时间更新。在文档中关于地图功能的一条规则中,它说:

它必须是一个"纯"函数:。。。这意味着任何时候相同的输入,它必须产生完全相同的输出。

上面显示的map函数的实现会违反该规则吗?在文件中,它进一步写道:

特别要避免以下常见错误:。。。不要做任何假设关于调用map函数的时间。这是一个实现细节索引器的。(例如,不是每次文档都调用它更改)。

这是否意味着,当其中一个文档的批准状态从false更新为true时,以下查询不一定包含更新后的文档?如果是这样的话,我需要做些什么才能做到这一点?我很不确定这条规则到底意味着什么?有人能试着睁开我的眼睛吗?

"纯"的意思是不能在映射函数中使用外部状态。你的所有决定都必须完全基于传递给它的参数。你的map函数不违反这一点。

我认为您理解中缺少的部分是存储和索引之间的区别。您可以将文档的修订存储到数据库中,对吗?这本身不会导致视图的索引被更新。这就是文档所说的"不是每次文档更改都调用"的含义。默认情况下,当运行下一个查询时,索引会更新,因此会输出文档的最新状态。实际上,自上次运行查询以来,它可能已经更改了很多次。

最新更新