CouchDB getting all posts from user in Node.js
首先我会说我已经做了很多研究,但我仍然很迷茫。
我有一个工作版本,但我敢肯定,这是你能做到的最低效的方法。我对知道计划数据库的最佳方法不是很有信心,很明显,我已经变得依赖 ActiveRecord。无论如何,我只是想弄清楚这些事情:
好的,所以我注意到了一些事情:第一,您不能将 I 客户端变量传递到视图中,因此使用这样的方法是行不通的。第二,我认为可能需要获取所有帖子,然后检查类型是否为帖子,然后返回匹配的文档,但这似乎有很多数据在移动。
一些代码:
所以我使用 Node.js、CouchDB 和 nano 作为中间件。
发布文件:
1 2 3 4 5 6 7 | { "_id":"post-slug", "title":"Post Slug", "user":"film42", "date": 1343451412, "type":"post" } |
用户文档:
1 2 3 4 5 6 7 8 9 | { "_id":"film42", "email":"[email protected]", "posts": [ "post-slug", "another-post-slug" ], "type":"user" } |
这是我目前获取所有帖子的方式(这真的很糟糕!):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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); }); }); |
我一直在使用视图,直到我意识到我无法传递变量,然后我查看了列表,但在阅读了许多教程后我迷失了。
感谢您的帮助!
你真的想使用视图。只需以用户为键在帖子上创建视图。
1 2 3 | function(doc) { emit(doc.user, {title: doc.title, date: doc.date, id: doc._id}); } |
那么你可以简单地查询它:
1 | GET /yourdb/_design/app/_view/by_user?key=film42 |
这将为您提供与该用户关联的所有查看文档。
就像 Will Hartung 说的,你想要一个视图,但是它应该看起来与 Will 显示的有点不同。
首先确保您要发出的字段存在。请记住,
这里有一些代码可以告诉你我的意思。
1 2 3 4 5 | function(doc) { if (doc.user && doc.title) { // This check is important emit(doc.user, {title: doc.title, date: doc.date}); } } |
您不必显式地发出文档 ID,因为无论如何这都会自动发生。还要确保不要发出整个文档
所以基本上如果你发出
GET /yourdb/_design/app/_view/by_user?key=film42&include_docs=true