选择你的第二个选项。这比处理冲突要容易得多。以下是一些示例文档,我可以如何构建数据:
{
_id: 12345,
type: 'question',
slug: 'couchdb-single-document-vs-joining-documents-together',
markdown: 'Im tryting to decide the best approach for a CouchApp (no middleware). Since there are similarities to...' ,
user: 'roman-geber',
date: 1322150148041,
'jquery.couch.attachPrevRev' : true
}
{
_id: 23456,
type: 'answer'
question: 12345,
markdown: 'Go with your second option...',
user : 'ryan-ramage',
votes: 100,
date: 1322151148041,
'jquery.couch.attachPrevRev' : true
}
{
_id: 45678,
type: 'comment'
question: 12345,
answer: 23456,
markdown : 'I really like what you have said, but...' ,
user: 'somedude',
date: 1322151158041,
'jquery.couch.attachPrevRev' : true
}
为了存储每个版本的修订,我会将旧版本作为附件存储在正在编辑的文档中。如果你使用 couchdb 的 jquery 客户端,你可以通过添加 jquery.couch.attachPrevRev = true 来免费获得它。请参阅jchris 的 CouchDB 中的版本控制文档
创建这样的视图
fullQuestion : {
map : function(doc) {
if (doc.type == 'question') emit([doc._id, null, null], null);
if (doc.type == 'answer') emit([doc.question, doc._id, null], null);
if (doc.type == 'comment') emit([doc.question, doc.answer, doc._id], null) ;
}
}
并像这样查询视图
http://localhost:5984/so/_design/app/_view/fullQuestion?startkey=['12345']&endkey=['12345',{},{}]&include_docs=true
(注意:我没有对这个查询进行 url 编码,但它更具可读性)
这将为您提供构建页面所需的问题的所有相关文档。唯一的问题是它们不会按日期排序。您可以在客户端(在 javascript 中)对它们进行排序。
编辑:这是查看和查询的替代选项
根据您的域,您知道一些事实。您知道在问题存在之前不能存在答案,并且在存在答案之前不能存在对答案的评论。因此,让我们创建一个视图,以加快创建显示页面的速度,同时尊重事物的顺序:
fullQuestion : {
map : function(doc) {
if (doc.type == 'question') emit([doc._id, doc.date], null);
if (doc.type == 'answer') emit([doc.question, doc.date], null);
if (doc.type == 'comment') emit([doc.question, doc.date], null);
}
}
这会将所有相关文档放在一起,并按日期排序。这是一个示例查询
http://localhost:5984/so/_design/app/_view/fullQuestion?startkey=['12345']&endkey=['12345',{}]&include_docs=true
这将取回您需要的所有文档,从最旧到最新排序。您现在可以压缩结果,知道父对象将在子对象之前,如下所示:
function addAnswer(doc) {
$('.answers').append(answerTemplate(doc));
}
function addCommentToAnswer(doc) {
$('#' + doc.answer).append(commentTemplate(doc));
}
$.each(results.rows, function(i, row) {
if (row.doc.type == 'question') displyQuestionInfo(row.doc);
if (row.doc.type == 'answer') addAnswer(row.doc);
if (row.doc.type == 'comment') addCommentToAnswer(row.doc)
})
因此,您不必执行任何客户端排序。
希望这可以帮助。