CouchDB индекс с $ или и $ и не работает, но только $ и делает
По какой-то причине у меня есть следующее .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"}]
});
1 ответ
Отсутствует отметка времени в селекторе
Чтобы выполнить сортировку по временной метке, она должна быть в вашем селекторе. Вы можете просто добавить его с помощью $gte:null.
Резервное состояние
UID кажется избыточным для вашего запроса. По этой причине я бы добавил это в отдельное условие.
Наконец, чтобы использовать ваш индекс, вы должны создать индекс со следующими полями: uid, timestamp, type (я думаю, что это необязательно).
{
"selector": {
"$and": [{
"uid": "123",
"timestamp": {
"$gte": null
}
},
{
"$or": [{
"type": "document"
},
{
"type": "page"
}
]
}
]
},
"sort": [{
"timestamp": "desc"
}]
}
Recommandation
Если вы хотите, чтобы ваши запросы использовали ваш индекс, я бы рекомендовал указать поле "use_index". Если вы сможете создавать версии своих индексов и запросов, это сделает запросы быстрее.