带有 $or 和 $and 的 CouchDB 索引不起作用,但只有 $and 起作用
CouchDB index with $or and $and not working but just $and does
出于某种原因,我有以下 .find()
命令,但我遇到了冲突的索引错误。以下是当我只尝试获取一种类型的文档时的一个工作示例。但是,如果我尝试获取 2 种类型的文档,由于某种原因它不起作用。
有谁知道为什么会这样吗?
我的索引文件:
{
"_id": "_design/index",
"_rev": "3-ce41abcc481f0a180eb722980d68f103",
"language": "query",
"views": {
"index": {
"map": {
"fields": {
"type": "asc",
"timestamp": "asc"
},
"partial_filter_selector": {}
},
"reduce": "_count",
"options": {
"def": {
"fields": [
"type",
"timestamp"
]
}
}
}
}
}
作品:
var result = await POUCHDB_DB.find({
selector:{
$and: [{type:"document"},{uid:"123"}]
},
limit:50,
bookmark: bookmark,
sort: [{timestamp: "desc"}]
});
无效:
var result = await POUCHDB_DB.find({
selector:{
$or: [
{$and: [{type:"document"},{uid:"123"}]},
{$and: [{type:"page"},{uid:"123"}]}
]
},
limit:50,
bookmark: bookmark,
sort: [{timestamp: "desc"}]
});
选择器中缺少时间戳
为了使用时间戳进行排序,它必须在您的选择器中。您可以简单地添加一个 "$gte":null.
冗余条件
uid 对于您的查询来说似乎是多余的。因此,我将其添加到一个单独的条件中。
最后,为了使用您的索引,您应该创建一个包含以下字段的索引:uid、timestamp、type(我认为这个是可选的)。
{
"selector": {
"$and": [{
"uid": "123",
"timestamp": {
"$gte": null
}
},
{
"$or": [{
"type": "document"
},
{
"type": "page"
}
]
}
]
},
"sort": [{
"timestamp": "desc"
}]
}
推荐
如果您希望查询使用您的索引,我建议您指定 "use_index" 字段。如果您可以对索引和查询进行版本控制,它将使查询速度更快。
出于某种原因,我有以下 .find()
命令,但我遇到了冲突的索引错误。以下是当我只尝试获取一种类型的文档时的一个工作示例。但是,如果我尝试获取 2 种类型的文档,由于某种原因它不起作用。
有谁知道为什么会这样吗?
我的索引文件:
{
"_id": "_design/index",
"_rev": "3-ce41abcc481f0a180eb722980d68f103",
"language": "query",
"views": {
"index": {
"map": {
"fields": {
"type": "asc",
"timestamp": "asc"
},
"partial_filter_selector": {}
},
"reduce": "_count",
"options": {
"def": {
"fields": [
"type",
"timestamp"
]
}
}
}
}
}
作品:
var result = await POUCHDB_DB.find({
selector:{
$and: [{type:"document"},{uid:"123"}]
},
limit:50,
bookmark: bookmark,
sort: [{timestamp: "desc"}]
});
无效:
var result = await POUCHDB_DB.find({
selector:{
$or: [
{$and: [{type:"document"},{uid:"123"}]},
{$and: [{type:"page"},{uid:"123"}]}
]
},
limit:50,
bookmark: bookmark,
sort: [{timestamp: "desc"}]
});
选择器中缺少时间戳
为了使用时间戳进行排序,它必须在您的选择器中。您可以简单地添加一个 "$gte":null.
冗余条件
uid 对于您的查询来说似乎是多余的。因此,我将其添加到一个单独的条件中。
最后,为了使用您的索引,您应该创建一个包含以下字段的索引:uid、timestamp、type(我认为这个是可选的)。
{
"selector": {
"$and": [{
"uid": "123",
"timestamp": {
"$gte": null
}
},
{
"$or": [{
"type": "document"
},
{
"type": "page"
}
]
}
]
},
"sort": [{
"timestamp": "desc"
}]
}
推荐
如果您希望查询使用您的索引,我建议您指定 "use_index" 字段。如果您可以对索引和查询进行版本控制,它将使查询速度更快。