2014-09-11 3 views
2

У меня есть база данных документов, которые имеют следующую структуру данных:безгильзовое согласования с использованием представлений в Cloudant

{ 
    "_id": "sampleID", 
    "_rev": "sample-rev", 
    "added": "2014-09-09 01:05:32", 
    "cached": 1, 
    "subject": "sample topic", 
    "mode": "<samplemode>", 
    "protected": 0, 
    "added_by": "myname", 
    "factoid": "sample factoid" 
} 

И у меня есть следующий вид:

function(doc) { 
    if (doc.subject && doc.factoid && doc.mode){ 
     emit(doc.subject, doc.factoid); 
    } 
} 

Мне нужно, чтобы получить все документы, где это «субъект» соответствует предоставленному ключу. Я бы хотел, чтобы это было не чувствительным к регистру. POST даст мне все совпадения, которые я хочу, но только в случае совпадения.

https://<username>.cloudant.com/<db>/_design/<designdoc>/_view/<view>?include_docs=true 

{ "keys" : ["<subject>"] } 

Я также попытался найти индексы без успеха. В этом API упоминается оператор регулярных выражений, который я не смог получить. Кажется, что это просто, как мне подойти к этому?

Что касается подхода $ regex, вот где я нахожусь. Следующий POST работает так же, как и мои предыдущие попытки вернуть результаты, чувствительные к регистру.

https://<username>.cloudant.com/<db>/_find 

{ 
    "selector": { 
     "subject": {"$eq": "<subject>"} 
    }, 
    "fields": ["_id", "_rev", "subject", "factoid"] 
} 

Подставляя оператор $ регулярного выражения для $ эк дает следующее сообщение об ошибке:

{ 
"error": "no_usable_index", 
"reason": "There is no operator in this selector can used with an index." 
} 

Опорный материал для этой функции весьма невелик. Он упоминается только на этой странице: https://docs.cloudant.com/api/cloudant-query.html

ответ

0

Одним из вариантов является создание вторичного индекса, который хранит в верхнем регистре строку поиска:

function(doc) { 
    if (doc.subject){ 
        emit(doc.subject.toUpperCase()); 
    } 
} 

Приложение может затем прописные критерии поиска перед отправкой его в базу данных:

https://username.cloudant.com/database/_design/designdoc/_view/view?key=“SAMPLE TOPIC"&include_docs=true 

Будет ли результат в этом:

{ 
    "offset": 0, 
    "rows": [ 
        { 
            "doc": { 
                "_id": "sampleID", 
                "_rev": "1-d77a468b74497771f8d37130a7cf02eb", 
                "added": "2014-09-09 01:05:32", 
                "added_by": "myname", 
                "cached": 1, 
                "factoid": "sample factoid", 
                "mode": "<samplemode>", 
                "protected": 0, 
                "subject": "sample topic" 
            }, 
            "id": "sampleID", 
            "key": "SAMPLE TOPIC", 
            "value": null 
        } 
    ], 
    "total_rows": 1 
} 
3

Я думаю, что использование оператора регулярных выражений Cloudant Query $ - это путь.

Причина, по которой вы получили эту ошибку при ее подзапросе, заключалась в том, что вы не можете использовать $ regex в качестве основы вашего выражения выбора. Вот соответствующие биты из их документации (https://docs.cloudant.com/api.html#condition-operators):

However, not all operators can be used as the base or starting point of the selector expression.

You cannot use combination or array logical operators such as $regex as the basis of a query.

Так вместо этого, вы могли бы сделать что-то вроде:

https://<username>.cloudant.com/<db>/_find 

{ 
    "selector": { 
     "_id": { 
      "$gt": null 
     }, 
     "subject": {"$regex": "<subject>"} 
    }, 
    "fields": ["_id", "_rev", "subject", "factoid"] 
} 

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

This expression is always true, enabling the remainder of the selector expression to be applied.

Using {"_id": { "$gt":null } } induces a full-table scan, and is not efficient for large databases.

+0

URL-адрес для $ регулярное выражение документации изменилось, здесь вы идете: https://console.bluemix.net/docs/services/Cloudant/ апи /cloudant_query.html#combination-operators – Netsmile

Смежные вопросы