Nosql couchbase中的复合视图
我是Couchbase的新手,我正努力让一个综合指数达到我想要的效果。用例如下所示:Nosql couchbase中的复合视图,nosql,couchbase,couchbase-view,Nosql,Couchbase,Couchbase View,我是Couchbase的新手,我正努力让一个综合指数达到我想要的效果。用例如下所示: 我有一组“枚举”存储为文档 每个字段都有一个“last_updated”字段,您可能已经猜到了,该字段存储该字段上次更新的时间 我希望能够仅显示自某个给定日期以来已更新的枚举,但仍按枚举名称对列表进行排序 我创建了一个Couchbase视图,如下所示: function (doc, meta) { var time_array; if (doc.doc_type === "enum") {
- 我有一组“枚举”存储为文档
- 每个字段都有一个“last_updated”字段,您可能已经猜到了,该字段存储该字段上次更新的时间
- 我希望能够仅显示自某个给定日期以来已更新的枚举,但仍按枚举名称对列表进行排序
function (doc, meta) {
var time_array;
if (doc.doc_type === "enum") {
if (doc.last_updated) {
time_array = doc.last_updated.split(/[- :]/);
} else {
time_array = [0,0,0,0,0,0];
}
for(var i=0; i<time_array.length; i++) { time_array[i] = parseInt(time_array[i], 10); }
time_array.unshift(meta.id);
emit(time_array, null);
}
当列表按“id”排序时,它不会过滤任何内容!谁能告诉我我做错了什么?是否有更好的组合视图来实现这些结果?在couchbase中,当您通过startkey-endkey查询视图时,您无法通过2个或更多属性筛选结果。Couchbase只有一个索引,所以它将只按第一个参数过滤结果。因此,您的查询将与以下查询相同:
startkey = ["a"]
endkey = ["Z"]
菲利佩·马纳纳(Filipe Manana)给出了一个完整的答案,解释了为什么不能按这些日期过滤
这里有一段引语:
对于复合键(数组),从左到右比较元素,当一个元素与另一个键中的对应元素不同时,比较就会结束(与比较字符串时发生的情况相同,如la memcmp()或strcmp()
因此,如果您想要一个按日期过滤的视图,那么日期数组应该在复合键中放在第一位。不过,我不明白的是,如果我不引入字符串组件,而只是使用数组元素,即日期和时间的各个方面,我可以使用start/end_键过滤数组中的任何元素,它们似乎也用于排序目的。是的。Couchbase按键对结果进行排序,因此,如果您有复杂的键,如
[doc.a、doc.b、doc.c]
文档将首先按doc.a排序,然后具有相同doc.a的值将按doc.b排序,以此类推。如果startkey:['a'、'b'、'c']
和endkey:['z'、'x'、'c']
couchbase查找仅满足第一个条件的所有密钥,则使用相同的行为进行筛选。但是如果在开始/结束键中有相同的值,比如['a','b']
和['a','x']
couchbase将选择带有doc.a='a'
和doc.b='b'..'x'
的文档。
startkey = ["a"]
endkey = ["Z"]