0

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

在数据库中,应用程序存储具有各种文档类型的文档。在一个查询中,我需要按文档类型(“payments”)和文档属性的值(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["approved"] 值可以随着时间的推移而更新。在文档中有关地图功能的规则之一中,它说:

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

如上所示的 map 函数的实现会违反该规则吗?在文档中它进一步说:

尤其要避免这些常见错误: ...不要对何时调用 map 函数做任何假设。这是索引器的实现细节。(例如,每次文档更改时都不会调用它。)。

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

4

1 回答 1

1

“纯”意味着您不能在地图功能中使用外部状态。您的所有决定都必须完全基于传递给它的参数。您的地图功能不违反此规定。

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

于 2015-06-22T22:59:36.767 回答