如何在Android中的Couchbase-lite中实现“WHERE”条件

时间:2016-06-05 11:10:19

标签: android couchbase-lite

我想找到特定键具有相同给定值的所有文档。在SQL中,这可以使用WHERE子句实现。在Mongo中,我可以使用find()。但我不确定如何在Android中的Couchbase-lite中实现这一点。如果有人可以帮助解决这个问题会很棒。谢谢。

4 个答案:

答案 0 :(得分:3)

这就是我解决问题的方法。

创建和初始化视图的代码:

com.couchbase.lite.View dateTimeView = database.getView("dateTimeView");
dateTimeView.setMap(new Mapper() {
    @Override
    public void map(Map<String, Object> document, Emitter emitter) {
        String dateTime = (String) document.get(QuickstartPreferences.DATE_TIME); // String for Key
        emitter.emit(dateTime, null);        
    }
}, "1");

查询上述观点的代码:

Query query = database.getView("dateTimeView").createQuery();
query.setLimit(100);
query.setStartKey(date_time); //to retreive records for a given date_time value
query.setEndKey(date_time); 
QueryEnumerator result = null;
try {
    result = query.run();    
    for (Iterator<QueryRow> it = result; it.hasNext(); ) {
        QueryRow row = it.next();
        <String, Object> map = row.getDocument().getProperties();
        String employeeName = map.get(QuickstartPreferences.EMPLOYEE_NAME).toString(); // String for Key
        if(employeeName.equalsIgnoreCase(employee_name)) {
            // other logic
        }
    }
} catch (CouchbaseLiteException e) {
    e.printStackTrace();
}

此处的重点是,当您为视图设置Map时,查询字段的值必须设置为Key(而不是Value)。 value可以是null。然后,您可以轻松使用setStartKey&amp; setEndKey函数。

答案 1 :(得分:1)

CouchbaseLite基于 Map / Reduce 的概念。您必须在数据库上定义 View ,然后设置其 Map 函数,该函数将在数据库中的每个文档上运行并创建索引为您所需的查询。例如:

View userView= database.getView("User");
userView.setMap(new Mapper() {
    @Override
    public void map(Map<String, Object> document, Emitter emitter) {
        // Your Logic here
        String Id = document.get("Id").toString();
        if (Id != null && Id.contains("John")) {
            emitter.emit(Id, document);
        }
    }
}, "1");
Query query = userView.createQuery();
QueryEnumerator result = query.run();
for (Iterator<QueryRow> it = result; it.hasNext(); ) {
    QueryRow row = it.next();
    Log.e("myDocument", row.getDocument().toString())
}

不幸的是,CouchbaseLite还不支持N1QL,但我已经在未来的路线图上看到了它。

答案 2 :(得分:0)

Couchbase Lite不使用查询语言;它使用map / reduce。听起来好像你以前没遇到过。我们有关于how map/reduce views work的文档以及如何查询它们。

答案 3 :(得分:0)

使用map reduce要理解的一件重要事情是map和reduce都不是写where子句的正确位置。

只有在View不存在时才会调用map函数。因此,当数据因数据同步或用户操作而发生变化时,将调用它。将一些文档属性与map函数中的用户传递值进行比较从根本上说是错误的。

正确的方法是使用map作为只有值独立过滤的select子句(如果有的话)。之后,当我们从View中接收查询对象时,我们可以执行基于值的检查。

相关问题