Search code examples
jointwittercouchdbclonetimeline

Building a (simple) twitter-clone with CouchDB


I'm trying to build a (simple) twitter-clone which uses CouchDB as Database-Backend. Because of its reduced feature set, I'm almost finished with coding, but there's one thing left I can't solve with CouchDB - the per user timeline.

As with twitter, the per user timeline should show the tweets of all people I'm following, in a chronological order. With SQL it's a quite simple Select-Statement, but I don't know how to reproduce this with CouchDBs Map/Reduce.

Here's the SQL-Statement I would use with an RDBMS:

SELECT * FROM tweets WHERE user_id IN [1,5,20,33,...] ORDER BY created_at DESC;

CouchDB schema details

user-schema:

{
  _id:xxxxxxx,
  _rev:yyyyyy,
  "type":"user",
  "user_id":1,
  "username":"john",
  ...
}

tweet-schema:

{
"_id":"xxxx",
"_rev":"yyyy",
"type":"tweet",
"text":"Sample Text",
"user_id":1,
...
"created_at":"2011-10-17 10:21:36 +000"
}

With view collations it's quite simple to query CouchDB for a list of "all tweets with user_id = 1 ordered chronologically".

But how do I retrieve a list of "all tweets which belongs to the users with the ID 1,2,3,... ordered chronologically"? Do I need another schema for my application?


Solution

  • The best way of doing this would be to save the created_at as a timestamp and then create a view, and map all tweets to the user_id:

    function(doc){
      if(doc.type == 'tweet'){
        emit(doc.user_id, doc);
      }
    }
    

    Then query the view with the user id's as keys, and in your application sort them however you want(most have a sort method for arrays).

    Edited one last time - Was trying to make it all in couchDB... see revisions :)