Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用MapReduce视图查询Couchbase Lite问题_Java_Android_Couchbase_Couchbase Lite_Couchbase View - Fatal编程技术网

Java 使用MapReduce视图查询Couchbase Lite问题

Java 使用MapReduce视图查询Couchbase Lite问题,java,android,couchbase,couchbase-lite,couchbase-view,Java,Android,Couchbase,Couchbase Lite,Couchbase View,我一直在努力解决在我的移动Android设备上查询Couchbase lite 1.4数据库的问题。在我看来,我并不完全理解使用MapReduce视图进行查询的工作原理 因此,我有以下设置: 1) 包含如下实体的数据库: { dateCreated: 1220227200, relatedObjectId: "objectId_23445" type: "mytype" } [1220227200, objectId_23445], [1220227201, objectId_3]

我一直在努力解决在我的移动Android设备上查询Couchbase lite 1.4数据库的问题。在我看来,我并不完全理解使用MapReduce视图进行查询的工作原理

因此,我有以下设置:

1) 包含如下实体的数据库:

{
  dateCreated: 1220227200,
  relatedObjectId: "objectId_23445"
  type: "mytype"
}
[1220227200, objectId_23445],
[1220227201, objectId_3],
[1220227202, objectId_7],
[1220227203, objectId_8],
[1220227204, objectId_23445]
String relatedObjectId = "objectId_23445"
Query query = CouchbaseViews.GetAllMyTypeItems().createQuery();            
query.setDescending(true);

ArrayList<Object> startKey = new ArrayList<Object>();
startKey.add(0);
startKey.add(relatedObjectId);

ArrayList<Object> endKey = new ArrayList<Object>();
endKey.add(Calendar.getInstance().getTimeInMillis());
endKey.add(relatedObjectId);

query.setStartKey(endKey);
query.setEndKey(startKey);
2) 我想查询我的数据库并获取类型为“mytype”的所有对象,这些对象与具有给定id的对象相关(relatedObjectId字段),并按dateCreated字段排序

以下是生成视图的my map函数:

public void map(Map<String, Object> document, Emitter emitter) {
    if (document.get("type") != null && document.get("type").equals("mytype")) {
        List<Object> keys = new ArrayList<Object>();
        keys.add(document.get("dateCreated");
        keys.add(document.get("relatedObjectId"));
        emitter.emit(keys, null);
    }
}
4) 我想让id为“objectId_23445”的所有对象按日期排序,如下所示:

[1220227200, objectId_23445],   
[1220227204, objectId_23445]
5) 但结果是,我总是从数据库中获取所有对象

第一个dateCreated似乎被考虑在内,但我的键的第二部分(relatedObjectId)并没有真正参与过滤。所以我总是从第三点得到一个列表

我的问题是这样的:

{
  dateCreated: 1220227200,
  relatedObjectId: "objectId_23445"
  type: "mytype"
}
[1220227200, objectId_23445],
[1220227201, objectId_3],
[1220227202, objectId_7],
[1220227203, objectId_8],
[1220227204, objectId_23445]
String relatedObjectId = "objectId_23445"
Query query = CouchbaseViews.GetAllMyTypeItems().createQuery();            
query.setDescending(true);

ArrayList<Object> startKey = new ArrayList<Object>();
startKey.add(0);
startKey.add(relatedObjectId);

ArrayList<Object> endKey = new ArrayList<Object>();
endKey.add(Calendar.getInstance().getTimeInMillis());
endKey.add(relatedObjectId);

query.setStartKey(endKey);
query.setEndKey(startKey);
String relatedObjectId=“objectId\u 23445”
Query Query=CouchbaseViews.GetAllMyTypeItems().createQuery();
query.setDescending(true);
ArrayList startKey=新的ArrayList();
startKey.add(0);
startKey.add(relatedObjectId);
ArrayList endKey=新的ArrayList();
add(Calendar.getInstance().getTimeInMillis());
endKey.add(relatedObjectId);
query.setStartKey(endKey);
query.setEndKey(startKey);
所以我需要帮助。在我看来,我只是不明白当key是复合键(在我的例子中是arrayList)时如何过滤对象

Ofc作为一种解决方法,我只能发出relatedObjectId,然后手动对数据进行排序,但这是一种正确的方法吗


任何帮助都将不胜感激,提前感谢

经过一些额外的研究(包括一些关于stackoverflow的帖子),我解决了我的问题

似乎为了实现我想要的,首先我必须在map()函数中颠倒顺序:

public void map(Map<String, Object> document, Emitter emitter) {
    if (document.get("type") != null && document.get("type").equals("mytype")) {
        List<Object> keys = new ArrayList<Object>();    
        //order of elements have been changed                        
        keys.add(document.get("relatedObjectId"));
        keys.add(document.get("dateCreated");
        emitter.emit(keys, null);
    }
}
最后,我必须修改我的查询,如下所示:

String relatedObjectId = "objectId_23445"
Query query = CouchbaseViews.GetAllMyTypeItems().createQuery();            
query.setDescending(true);

ArrayList<Object> startKey = new ArrayList<Object>();            
startKey.add(relatedObjectId);

ArrayList<Object> endKey = new ArrayList<Object>();
endKey.add(relatedObjectId);
endKey.add(new HashMap<>());

query.setStartKey(endKey);
query.setEndKey(startKey);
String relatedObjectId=“objectId\u 23445”
Query Query=CouchbaseViews.GetAllMyTypeItems().createQuery();
query.setDescending(true);
ArrayList startKey=新的ArrayList();
startKey.add(relatedObjectId);
ArrayList endKey=新的ArrayList();
endKey.add(relatedObjectId);
add(新的HashMap());
query.setStartKey(endKey);
query.setEndKey(startKey);
现在,我的查询将首先选择具有relatedObjectId的所有元素,然后对该序列进行排序。由于所有元素的前缀都相同(relatedObjectId),因此在排序过程中将考虑第二项(dateCreated