Последовательный идентификатор, вероятно, не лучший выбор для большинства реальных приложений. Например, если вы должны были построить комментирует систему я бы подойти к нему, как это (есть similar example в диванных документах):
Комментариев бы документы со структурой, как это:
{
"_id": "comment_id",
"parent":"comment_id, or article_id if a top level comment"
"timestamp" : "iso datetime populated by the server",
"user_id": "the person who wrote the comment",
"content": "content of the comment"
}
Для отображения все лучшие комментарии уровня данного родителя (либо статьи или родительский комментарий), вы можете использовать представление, как это:
def function(doc){
emit([doc.parent, doc.timestamp, doc.user_id], doc._id)
}
для эффективного запроса этого, вы можете использовать следующую query options, чтобы захватить первые двадцать :
{
"startkey": ["parent_id"],
"endkey": ["parent_id", {}],
"limit": 20,
"skip": 0,
"include_docs": true
}
Комментарии будут автоматически сортироваться по дате их публикации, поскольку представление упорядочено [parent, datetime, а затем пользователем]. У вас нет пропущенного значения для чего-либо другого, кроме родителя с вашим ключом, для получения выгоды от этого.
Еще одно примечание: не передавать содержание комментария в представление и вместо этого использовать include_docs, ваш индекс останется как можно более тонким.
Для расширения этого:
- Если вы хотите, чтобы показать ответы на базовый комментарий, вы можете просто изменить начале и в конце ключи для этого комментария ид.
- Если вы хотите показать следующие 20 комментариев, просто смените пароль на 20.
- Если вы хотите, чтобы больше комментариев отображалось первоначально, просто доведите значение до предела.
В ответ на ваш комментарий, если у вас массив или родителей в документе, как:
"parents" : ["a100", "a101", "a102"]
Все остальное останется тем же, за исключением того, что испускают строку для каждого родителя.
def function(doc){
doc.parents.map(function (parent){
emit([doc.parent, doc.timestamp, doc.user_id], doc._id)
});
}
Можете ли вы указать какой-то контекст, почему вы хотите это сделать/как вы хотите это использовать? Вы не можете сделать это так, как было разработано, потому что никакая область не хранится вне вашей функции. Кроме того, любому предоставленному комментарию не гарантируется одно и то же значение «i» для нескольких прогонов представления. – sarwar
@sarwar Я просто подумал, что это будет легко сделать, но теперь вы объяснили, почему это не так, * не существует области вне функции (doc) *. Это имеет смысл, но вы уверены в этом? Я хотел создать упорядоченный список, но, возможно, я могу просто получить список с помощью View и использовать '? Startkey = x' и' endkey = x + 3' для получения индексных фрагментов. BTW, я все еще изучаю CouchDB, поэтому пока у меня нет проекта, я просто играю с ним – flen
Я добавил ответ, который показывает мой типичный подход к использованию ключей.Многопользовательские ключи - ваш друг. – sarwar