0

如何针对 couchdb 视图优化此 SQL 查询?

SELECT * FROM db WHERE user = '$userid' OR userFollowed = '$userid'

couchdb 数据库包含以下文档结构:

_id
user    
userFollowed

这是因为一个用户可以关注另一个用户,反之亦然,我的范围是让用户 A 的所有关注者都关注该用户,例如:

A跟随B

B跟随A

在这个例子中,我需要获得 B,确保两个用户都是追随者......我知道解释和理解很复杂,但我会尝试使用 node.js 和 cradle 做的事情。

视图地图:

function (doc) { 
    emit(doc.user, doc.userFollowed) 
}

node.js 代码:

db.view("followers/getFollowers", function(err, resp) {
  if (!err) {
     var followers = [];

     resp.forEach(function(key, value, id) {
        var bothFollow = false;

        if (key == userID) {
           if (followers.indexOf(value) == -1) {                  
              resp.forEach(function(key, value, id) {
                 if (value == userID)
                    bothFollow = true;
              });

              if (bothFollow)
                 followers.push(value);
           }
         } else if (value == userID) {
           if (followers.indexOf(key) == -1) {
              resp.forEach(function(key, value, id) {
                 if (key == userID)
                    bothFollow = true;
              });

              if (bothFollow)
                 followers.push(key);
           }
        }
     });

     console.log(followers);
  }
});    

因此,在代码中,我首先检查 A 或 B 值是否与其他用户相对应,然后检查另一个循环是否存在将关注者放入列表的关系

所有这些代码都有效,但我认为这不是正确的程序,也许我错了什么:(你能帮帮我吗?

4

1 回答 1

1

在视图函数中发出两个用户更容易:

function (doc) { 
    emit(doc.user, null); 
    emit(doc.userFollowed, null); 
} 

你可以只调用视图并得到一个简单的列表:

http://localhost:5984/db/_design/app/_view/followers?include_docs=true
于 2014-04-08T07:23:58.817 回答