Установка явно ключей документа CouchDB - PullRequest
0 голосов
/ 26 октября 2011

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

 wget "http://localhost:5984/monitor20n/_all_docs?startkey=1111&endkey=2222

Тем не менее, очевидно, что ключ всегда совпадает с идентификатором документа, так что все, что вы получаете, это что-то вроде этого

{"total_rows":14269,"offset":0,"rows":[
{"id":"128127896626798592","key":"128127896626798592","value":{"rev":"1-4e07e2c4b4eddfad5846ddf905337197"}},
{"id":"128128575021907970","key":"128128575021907970","value":{"rev":"1-43d983af1e837a4415b6167cae3b5de8"}},
... and so on }}

(см. Здесь ключ == id). Тем не менее, вы можете использовать более сложные ключи в представлениях, включая векторы, которые обеспечивают гораздо более сложное взаимодействие; по крайней мере, вы можете установить ключи представлений, чтобы теперь заранее знать, что искать, не просматривая идентификаторы документов. Вопрос сейчас: вы можете установить эти ключи при создании документа? Или, может быть, после его создания? Очевидный обходной путь - создать вид, подобный этому

function (doc) {
    emit(doc.key,doc)
}

однако, я хотел бы знать, есть ли более прямой способ получить тот же эффект.

1 Ответ

4 голосов
/ 26 октября 2011

Ключи являются важной частью представлений CouchDB. С точки зрения, ключ не должен быть идентификатором документа. Но единственный способ создать ключ - использовать функцию emit из представления. Вы не можете установить свойство, которое автоматически станет ключом.

Думайте о _all_docs как о встроенном представлении. Чтобы быть последовательным, он следует тому же выводу, что и обычный вид, и использует идентификатор в качестве ключа. Но вы не можете изменить представление _all_docs. Если вы хотите указать свой собственный _id при сохранении документа, это будет ключом. Поэтому, если вы хотите использовать пользовательские «ключи» в представлении «_all_docs», вы можете создать такие документы:

{_id: 'Sample1'}, {_id: 'My2'}. и после их сохранения, когда вы запрашиваете представление '_all_docs', вы получите: { "TOTAL_ROWS": 2, "смещение": 0, "строка": [ { "ID": "ключ" "Sample1": "Sample1", "значение": { "оборот": "1-4e07e2c4b4eddfad5846ddf905337197"}}, { "ID": "MY2", "ключ": "MY2", "значение": { "оборот": "1-43d983af1e837a4415b6167cae3b5de8"}}, ... и так далее}}

Вот ссылка о том, что делает documentID:

http://wiki.apache.org/couchdb/HTTP_Document_API#Special_Fields

Хотя это не говорит явно, вы не можете использовать объекты или массивы в качестве идентификаторов документов.

Надеюсь, это поможет.

...