CouchDB从Node.js中获取用户的所有帖子

问题描述:

我会开始说我做了很多研究,但我仍然很迷茫。CouchDB从Node.js中获取用户的所有帖子

我有一个工作版本,但这是我可以做到的最低效率的方式。对于了解规划数据库的最佳方式,我并不是非常有信心,我已经明确地依赖于ActiveRecord。反正,我只是想弄清楚这些事情:

  1. 找出计划数据库(我应该如何分开文件)
  2. 找到最有效的应对关系
  3. 找到最好的方法很好的方法从服务器查询

好的,所以我注意到一些事情:一,你不能将我的客户端变量传递到视图,所以使用这样的方法将无法正常工作。二,我认为可能会有所有的帖子,然后检查类型是否发布,然后返回匹配的文档,但这似乎有很多数据移动。

一些代码:

所以我如何使用Node.js,CouchDB的,和纳米中间件。

发表文件:

{ 
"_id": "post-slug", 
"title": "Post Slug", 
"user": "film42", 
"date": 1343451412, 
"type": "post" 
} 

用户文档:

{ 
"_id": "film42", 
"email": "[email protected]", 
"posts": [ 
    "post-slug", 
    "another-post-slug" 
], 
"type": "user" 
} 

这里就是我目前获取所有职位(这是非常糟糕的!):

function buildUserPostArray(array, user, res, i) { 
    db.get(user.posts[i], function(err, post_obj) { 
     if(i < user.posts.length) { 
      array.push(post_obj); 
      buildUserPostArray(array, user, res, i+1); 
     } 
     else { 
      console.log('Rendering view now.'); 
      res.render('user.jade', { 
       user: user.user, 
       posts: array 
      }); 
     } 
    }); 
} 

app.get('/users/:id', function(req, res) { 
    db.get(req.params.id, function(err, user_obj) { 
     if(err) res.send('err1'); //bad id or server down 

     array = []; 
     buildUserPostArray(array, user_obj, res, 0); 
    }); 
}); 

我使用意见直到我意识到我无法传递一个变量,然后我查看了列表,但在阅读了许多教程之后我迷了路LS。

感谢您的帮助!

你真的想使用一个视图。只需以用户为关键字在帖子上创建视图即可。

function(doc) { 
    emit(doc.user, {title: doc.title, date: doc.date, id: doc._id}); 
} 

然后,你可以简单地查询它:

GET /yourdb/_design/app/_view/by_user?key=film42 

这会给你所有与该用户相关联的视图文件。

+0

干杯!那就是诀窍。非常感谢! – film42 2012-07-29 04:36:45

就像Will Hartung所说的那样,你需要一个观点,但它应该看起来有点不同于Will的表现。

首先确保您想要发射的字段存在。请记住,null0是JavaScript中的虚假值,因此根据您的数据结构,您可能必须明确检查字段是否为undefined

下面是一些代码,向你展示我的意思。

function(doc) { 
    if (doc.user && doc.title) { // This check is important 
     emit(doc.user, {title: doc.title, date: doc.date}); 
    } 
} 

您不必显式地发出文档ID,因为无论如何都会自动发生。另外请确保不要发出整个文件emit(doc.user, doc);。这是低效的。如果您需要整个文档仅发送null作为值并使用include_docs=true URL参数。

所以基本上如果你发出null作为一个值,那么你会得到这样的文件。

GET/yourdb/_design /应用/ _view/by_user?关键= film42 & include_docs =真

+0

伟大的回应。我稍微改变了威尔(实际上它现在看起来和你的一样),但它指出了我正确的方向! – film42 2012-07-29 22:19:13