在 couchbase-lite 中排序和查询文档 android
Sorting and querying documents in couchbase-lite android
我想做的是找到所有匹配某个 ID 并按名称排序的记录。数据类似于:
{
type:"receiving",
saleName:"Harshitha",
penId:"7aac88118420858d62f5ea55e22"
}
{
type:"receiving",
saleName:"Tom",
penId:"81fb1a79526f4e2bdc77aa7d73d"
}
{
type:"receiving",
saleName:"James",
penId:"81fb1a79526f4e2bdc77aa7d73d"
}
我想获取具有按 saleName 排序的特定 penID 的文档。
例如:- 我想获取 penId 为“81fb1a79526f4e2bdc77aa7d73d”的文档,并按 saleName 对它们进行排序。喜欢这个顺序:-
{
type:"receiving",
saleName:"James",
penId:"81fb1a79526f4e2bdc77aa7d73d"
}
{
type:"receiving",
saleName:"Tom",
penId:"81fb1a79526f4e2bdc77aa7d73d"
}
我的看法是这样的,
View view = database.getView("receiving_view");
if (view.getMap() == null) {
view.setMap(new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
if (document.get("type").equals("receiving") ) {
List<Object> keys = new ArrayList<Object>();
keys.add(document.get("penId"));
keys.add(document.get("saleName"));
emitter.emit(keys, document);
}
}
}, "1.1");
}
return view;
然后我尝试这样获取数据,
View view = getView("receiving_view");
Query query = view.createQuery();
List<Object> keys = new ArrayList<Object>();
keys.add("81fb1a79526f4e2bdc77aa7d73d");
List<Object> allKeys = new ArrayList<Object>();
allKeys.add(keys);
query.setKeys(allKeys);
query.run();
它不起作用,因为我传递了一个键,但它们在视图中是两个键......但我不能将“saleName”作为键传递,因为我只想按“saleName”排序。最好的方法是什么?
我终于找到了解决办法。我不想在这里使用 setKeys,我应该使用范围内的键,而不是一组特定的键。
我将 startKey 设置为 [penID]
,将 endKey 设置为 [penID, {}]
。空映射排在任何其他值之后,因此此键范围包括所有以 penID
开头的键。我改变了我的数据获取方法。现在是这个样子,
View view = getView("receiving_view");
Query query = view.createQuery();
query.setStartKey(Arrays.asList("81fb1a79526f4e2bdc77aa7d73d"));
query.setEndKey(Arrays.asList("81fb1a79526f4e2bdc77aa7d73d", new HashMap<String, Object>()));
query.run();
我想做的是找到所有匹配某个 ID 并按名称排序的记录。数据类似于:
{
type:"receiving",
saleName:"Harshitha",
penId:"7aac88118420858d62f5ea55e22"
}
{
type:"receiving",
saleName:"Tom",
penId:"81fb1a79526f4e2bdc77aa7d73d"
}
{
type:"receiving",
saleName:"James",
penId:"81fb1a79526f4e2bdc77aa7d73d"
}
我想获取具有按 saleName 排序的特定 penID 的文档。 例如:- 我想获取 penId 为“81fb1a79526f4e2bdc77aa7d73d”的文档,并按 saleName 对它们进行排序。喜欢这个顺序:-
{
type:"receiving",
saleName:"James",
penId:"81fb1a79526f4e2bdc77aa7d73d"
}
{
type:"receiving",
saleName:"Tom",
penId:"81fb1a79526f4e2bdc77aa7d73d"
}
我的看法是这样的,
View view = database.getView("receiving_view");
if (view.getMap() == null) {
view.setMap(new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
if (document.get("type").equals("receiving") ) {
List<Object> keys = new ArrayList<Object>();
keys.add(document.get("penId"));
keys.add(document.get("saleName"));
emitter.emit(keys, document);
}
}
}, "1.1");
}
return view;
然后我尝试这样获取数据,
View view = getView("receiving_view");
Query query = view.createQuery();
List<Object> keys = new ArrayList<Object>();
keys.add("81fb1a79526f4e2bdc77aa7d73d");
List<Object> allKeys = new ArrayList<Object>();
allKeys.add(keys);
query.setKeys(allKeys);
query.run();
它不起作用,因为我传递了一个键,但它们在视图中是两个键......但我不能将“saleName”作为键传递,因为我只想按“saleName”排序。最好的方法是什么?
我终于找到了解决办法。我不想在这里使用 setKeys,我应该使用范围内的键,而不是一组特定的键。
我将 startKey 设置为 [penID]
,将 endKey 设置为 [penID, {}]
。空映射排在任何其他值之后,因此此键范围包括所有以 penID
开头的键。我改变了我的数据获取方法。现在是这个样子,
View view = getView("receiving_view");
Query query = view.createQuery();
query.setStartKey(Arrays.asList("81fb1a79526f4e2bdc77aa7d73d"));
query.setEndKey(Arrays.asList("81fb1a79526f4e2bdc77aa7d73d", new HashMap<String, Object>()));
query.run();