CouchDB индекс с $ или и $ и не работает, но только $ и делает - PullRequest
0 голосов
/ 19 декабря 2018

По какой-то причине у меня есть следующие .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 Ответ

0 голосов
/ 19 декабря 2018

Отсутствует отметка времени в селекторе

Чтобы выполнить сортировку по отметке времени, она должна быть в вашем селекторе.Вы можете просто добавить его с помощью $ gte: null.

Резервное условие

uid кажется избыточным для вашего запроса.По этой причине я бы добавил его в отдельное условие.

Наконец, чтобы использовать ваш индекс, вы должны создать индекс со следующими полями: uid, timestamp, type (я думаю, что это необязательно).).

{
  "selector": {
    "$and": [{
        "uid": "123",
        "timestamp": {
          "$gte": null
        }
      },
      {
        "$or": [{
            "type": "document"
          },
          {
            "type": "page"
          }
        ]
      }
    ]
  },
  "sort": [{
    "timestamp": "desc"
  }]
}

Рекомендация

Если вы хотите, чтобы ваши запросы использовали ваш индекс, я бы рекомендовал указать поле «use_index».Если вы сможете создавать версии своих индексов и запросов, это ускорит выполнение запросов.

...