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

我会开始说我做了很多研究,但是我还是很迷茫。

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

  1. 找出计划数据库的最佳方式(我应该如何分离文档)
  2. find最有效的处理关系
  3. find从服务器查询的好方法

好的,我注意到了一些事情:其一,你不能把我的客户端variables传递给视图,所以使用这种方法是行不通的。 二,我认为可能会有所有的post,然后检查types是否发布,然后返回匹配的文件,但似乎有很多数据移动。

一些代码:

所以我使用Node.js,CouchDB和nano作为中间件。

发布文档:

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

用户文档:

 { "_id": "film42", "email": "test@example.com", "posts": [ "post-slug", "another-post-slug" ], "type": "user" } 

这是我现在如何获取所有post(这真是糟糕!):

 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); }); }); 

我一直在使用视图,直到我意识到我不能传递一个variables,然后我查看了列表,但是在阅读了很多教程后我迷失了方向。

谢谢您的帮助!!

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

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

那么你可以简单地查询它:

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

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

就像威尔·哈通(Will Hartung)所说的那样,你需要一个观点,但是它应该看起来与威尔的performance有点不同

首先确保你想要发射的字段存在。 请记住, null0是JavaScript中的falsy值,因此取决于您的数据结构,您可能需要检查字段是否undefined明确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 / app / _view / by_user?key = film42&i​​nclude_docs = true