Команда ReQL: indexCreate
Синтаксис команды
table.indexCreate(indexName[, indexFunction][, {multi: false, geo: false}]) → object
Описание
Создайте новый вторичный индекс в таблице. Вторичные индексы улучшают скорость многих запросов на чтение за счет незначительного увеличения занимаемого места и уменьшения производительности при записи. Для получения дополнительной информации о вторичных индексах, прочитайте статью «Использование вторичных индексов в RethinkDB».
RethinkDB поддерживает различные типы вторичных индексов:
- Простые индексы, основанные на значении одного поля.
- Составные индексы, основанные на нескольких полях.
-
Многомерные индексы, основанные на массивах значений, создаются, когда
multiнеобязательный аргументtrue. -
Географические индексы, основанные на индексах геометрических объектов, создаются, когда
geoнеобязательный аргумент равен true. - Индексы на основе произвольных выражений.
indexFunction может быть анонимной функцией или двоичным представлением, полученным из поля function indexStatus. Функция должна быть детерминированной и не может использовать подзапрос или команду r.js.
В случае успеха, createIndex вернет объект следующего формата {"created": 1}. Если индекс с таким именем уже существует в таблице, будет выброшено ReqlRuntimeError.
Обратите внимание, что индекс может быть не сразу доступен после создания. Если ваше приложение необходимо использовать индексы сразу после их создания, используйте команду indexWait, чтобы убедиться, что индексы готовы к использованию.
Пример: Создание простого индекса, основанного на поле postId.
r.table('comments').indexCreate('postId').run(conn, callback)
Пример: Создание географического индекса, основанного на поле location.
r.table('places').indexCreate('location', {geo: true}).run(conn, callback)
Поле географического индекса должно содержать только геометрические объекты. Оно будет работать с геометрическими терминами ReQL (getIntersecting и getNearest), а также со специфичными для индексов терминами (indexStatus, indexWait, indexDrop и indexList). Использование терминов, основанных на негеометрическом порядке, таких как getAll, orderBy и between, приведет к ошибке.
Пример: Создание простого индекса, основанного на вложенном поле author > name.
r.table('comments').indexCreate('authorName', r.row("author")("name")).run(conn, callback)
Пример: Создание составного индекса, основанного на полях postId и date.
r.table('comments').indexCreate('postAndDate', [r.row("postId"), r.row("date")]).run(conn, callback)
Пример: Создание многомерного индекса, основанного на поле authors.
r.table('posts').indexCreate('authors', {multi: true}).run(conn, callback)
Пример: Создание географического многомерного индекса, основанного на поле towers.
r.table('networks').indexCreate('towers', {multi: true, geo: true}).run(conn, callback)
Пример: Создание индекса, основанного на произвольном выражении.
r.table('posts').indexCreate('authors', function(doc) {
return r.branch(
doc.hasFields("updatedAt"),
doc("updatedAt"),
doc("createdAt")
)
}).run(conn, callback)
Пример: Создание нового вторичного индекса, основанного на существующем.
r.table('posts').indexStatus('authors').nth(0)('function').run(conn, function (func) {
r.table('newPosts').indexCreate('authors', func).run(conn, callback);
});
Пример: Перестроение устаревшего вторичного индекса в таблице.
r.table('posts').indexStatus('oldIndex').nth(0).do(function(oldIndex) {
return r.table('posts').indexCreate('newIndex', oldIndex("function")).do(function() {
return r.table('posts').indexWait('newIndex').do(function() {
return r.table('posts').indexRename('newIndex', 'oldIndex', {overwrite: true})
})
})
})
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/javascript/index_create/