1

I just the beginner of couchdb so I may be misunderstand point of view so you can teach and discuss with me

Doc Type - User - Topic - Comment

Requirement - I want to webboard - 1 Request to get this complex doc

Output I need KEY "topic-id" , VALUE { _id : "topic-id", created_at:"2011-05-30 19:50:22", title:"Hello World", user: {_id : "user-1",type:"user",username:"dominixz",signature:"http://dominixz.com"} comments: [ {_id:"comment-1", text:"Comment 1",created_at:"2011-05-30 19:50:22",user: {_id : "user-1",type:"user",username:"dominixz",signature:"http://dominixz.com"}}, {_id:"comment-2", text:"Comment 2",created_at:"2011-05-30 19:50:23",user: {_id : "user-2",type:"user",username:"dominixz2",signature:"http://dominixz1.com"}}, {_id:"comment-3", text:"Comment 3",created_at:"2011-05-30 19:50:24",user: {_id : "user-3",type:"user",username:"dominixz3",signature:"http://dominixz2.com"}}, ] }

I have "user" data like this {_id:"user-1",type:"user",username:"dominixz",signature:"http://dominixz.com"} {_id:"user-2",type:"user",username:"dominixz2",signature:"http://dominixz1.com"} {_id:"user-3",type:"user",username:"dominixz3",signature:"http://dominixz2.com"}

"Topic" data like this {_id : "topic-id",created_at:"2011-05-30 19:50:22",title:"Hello World",user:"user-1"}

"Comment" data like this {_id:"comment-1",type:"comment" , text:"Comment 1", created_at:"2011-05-30 19:50:22" , user: "user-1" , topic:"topic-id"} {_id:"comment-2",type:"comment" , text:"Comment 2", created_at:"2011-05-30 19:50:23" , user: "user-2" , topic:"topic-id"} {_id:"comment-3",type:"comment" , text:"Comment 3", created_at:"2011-05-30 19:50:24" , user: "user-3" , topic:"topic-id"}

How can I write map,reduce,list for achieve this complex data ? and how about when I wanna use LIMIT , OFFSET like in db

Thank in advance

oers
  • 18,436
  • 13
  • 66
  • 75
DominixZ
  • 162
  • 4

2 Answers2

1

It's a bit hard to tell what you're looking for here, but I think you're asking for a classic CouchDB join as documented in this web page.

I'd recommend reading the whole thing, but the punchline looks something like this (translated for your data):

function (doc) {
    if (doc.type === 'topic') {
        emit([doc._id, 0, doc.created_at], null);
    } else if (doc.type === 'comment') {
        emit([doc._id, 1, doc.created_at], null);
    }
}

That map will return the topic ID followed by all of its comments in chronological order. The null prevents the index from getting too large, you can always add include_docs=true on your request to pull full docs when you need them, or you can use index best practices of including the bits that are interesting there.

Dustin
  • 89,080
  • 21
  • 111
  • 133
0

CouchDB is a document database, not a relational database. As such it is best suited to deal with documents that encompass all the related data. While you can normalize your schema relational-style like you did, I'd argue that this isn't be best use case for Couch.

If I were to design your CMS in Couch I'd keep the topic, content and comments all in a single document. That would directly solve your problem.

You're free of course to use document stores to emulate relational databases, but that's not their natural use case, which leads to questions like this one.

Elad
  • 3,145
  • 2
  • 20
  • 17
  • Storing comments directly on documents they point to is not advised. – Dustin Aug 31 '11 at 07:04
  • It's the classic blog post/blog comment example from most of the couchdb tutorials (and books). If you put comments directly on the original documents, you a) greatly reduce the probability of conflicts and b) walk yourself down a path where a popular post is an unmanageably large document. – Dustin Sep 01 '11 at 16:16