2012-12-10 44 views
0

我目前使用Couchdb来保存两个用户之间的聊天记录。我的数据库包含每个用户输入的每个插入的消息。他们进入这样的:Couchdb检索两个用户之间的聊天记录

{ 
    _id: (timestamp), 
    from: sender, 
    to: receiver, 
    message: msg 
} 

我有一个观点编码是这样的:

function(doc) { 
    if (doc.from && doc.to){ 
     (doc._id, doc); 
    } 
    } 

我有一个想法很难思维检索基于两个用户之间的聊天我的转换当前设置。

我做到了视图功能里面以下方式:

res.forEach(function (row) { 
    if(row.from != null || row.to != null){ 
      if((row.from == socket.username && row.to == receiver) || (row.from == receiver && row.to == socket.username)){ 
      MsgHistoryContent += row.message + '\n'; 
      } 
    } 
}); 

但因为它会检索所有从每个用户的邮件未检索到的只是两个用户之间的所有对话。

有人能给我带头吗?任何帮助,将不胜感激。

P.S:我正在使用node.js和摇篮。

+0

在发送到客户端之前,您可以使用_list函数进行过滤,但您仍然必须循环来自所有用户的每个聊天。您可以输出每个用户的视图,并在客户端自行整理它们。 –

回答

0

您可以创建一个地图功能是这样的:

function(doc) { 
    var key = [doc.from, doc.to].sort(function (a, b) { 
     return a.localeCompare(b); 
    }); 

    emit(key.concat(doc._id), doc); 
} 

然后你就可以通过查询” startkey =‘USER1’,‘用户2’] & endkey =让用户之间的对话[ “user1”,“user2”,{}]'。当然,起始键和尾键0和1索引应该按字母排序。

+0

谢谢!我会试试看看它是否有效。 –

+0

庆祝得太快!它实际上并没有工作:(也许这是我把startkey和endkey放在视图上的方式。我如何使用摇篮来传递它们?我这样做:couchdb.view('chat/history' ,filterRange,功能(ERR,结果){ \t \t \t \t \t \t \t \t \t \t \t results.forEach(函数(行){ \t \t \t \t \t \t \t \t \t \t的console.log(row.message + '\ n'); \t \t \t \t \t \t \t \t \t \t}); \t \t \t \t \t \t \t \t \t \t});它给了我“无法调用方法'forEach'的undefined。 –

+0

我终于能够通过一些沉重的搜索和使用您的答复来解决问题。 谢谢:)! –

相关问题