更好地解释couchbase lite map函数规则和常见错误

时间:2015-06-22 20:42:56

标签: android couchbase couchbase-lite couchbase-view

我是couchbase的新手,我正在尝试在我的一个Android应用程序中实现couchbase lite。我特别挣扎的是视图的概念和文档中所述的地图功能规则。

在数据库中,应用程序存储具有各种doc类型的文档。在一个查询中,我需要按文档类型获取整个文档("付款") 以及文档属性的值(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");
    }

请注意,doc [&#34;已批准&#34;]值可以随时更新。在其中一个关于文档中的地图功能的规则中,它说:

  

它必须是纯粹的&#34;功能:...这意味着随时随地调用   相同的输入,它必须产生完全相同的输出。

如上所示地图功能的实施是否会违反该规则? 在文档中,它进一步说:

  

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

这是否意味着当其中一个文档的已批准状态从false更新为true时,以下查询不会包含更新的文档?如果是这样,我需要做些什么来实现这一目标?我很不确定什么样的规则意味着什么?有人可以试着睁开我的眼睛吗?

1 个答案:

答案 0 :(得分:1)

什么&#34;纯粹&#34;意思是你不能在地图功能中使用外部状态。您的所有决定都必须完全基于传递给它的参数。您的地图功能不违反此规定。

我认为您理解中缺失的部分是存储和索引之间的区别。您可以将文档的修订版存储到数据库中,对吧?这本身并不会导致视图的索引被更新。这就是文档的含义,并且每次文档发生变化时都不会调用。&#34;默认情况下,在运行下一个查询时,将更新索引,因此将输出文档的最新状态。自上次查询运行以来,它实际上可能已经多次更改。