Индексировать и запрашивать элементы в массиве с запросом манго для cloudant и couchdb 2.0

У меня есть следующая структура БД:

{"_id": "0096874","genre": ["Adventure","Comedy", "Sci-Fi" ]}
{"_id": "0099088","genre": ["Comedy", "Sci-Fi", "Western"]}

и хотел бы запросить его, как я мог бы сделать в Mongodb

db.movies.find({genre: {$in: ["Comedy"]}})

Это работает, когда я использую текстовый индекс для всей базы данных, но это кажется очень расточительным:

// index
    {
      "index": {},
      "type": "text"
    }
//query
{
  "selector": {
    "genre": {
      "$in": ["Comedy"]
    }
  },
  "fields": [
    "_id",
    "genre"
  ]
}

Следующий индекс не работает:

{
  "index": {
    "fields": [
      "genre"
    ]
  },
  "type": "json"
}

Каков правильный индекс для облачного запроса, который не индексирует всю базу данных? Спасибо за вашу помощь

1 ответ

Решение

У тебя было почти правильно. Ваш индекс верен, но вам нужно добавить селектор, чтобы получить все идентификаторы https://cloudant.com/blog/mango-json-vs-text-indexes/.

Это не очень хорошее решение с точки зрения производительности, как говорит Тони,

Причина, по которой это работает, опять же заключается в том, что Mango выполняет указанный выше $ в качестве механизма фильтрации всех документов. Как мы видели в заключении предыдущего раздела о синтаксисе JSON, компромисс производительности с запросом выше заключается в том, что он, по сути, выполняет полное сканирование индекса, а затем применяет фильтр.

{
  "selector": {
    "_id": {
      "$gt": null
    }, 
    "genre": {
      "$in": ["Western"]
    }
  },
  "fields": [
    "_id",
    "genre"
  ],
  "sort": [
    {
      "_id": "asc"
    }
  ]
}
Другие вопросы по тегам