CouchDB从Node.js中获取用户的所有帖子
我会开始说我做了很多研究,但我仍然很迷茫。CouchDB从Node.js中获取用户的所有帖子
我有一个工作版本,但这是我可以做到的最低效率的方式。对于了解规划数据库的最佳方式,我并不是非常有信心,我已经明确地依赖于ActiveRecord。反正,我只是想弄清楚这些事情:
- 找出计划数据库(我应该如何分开文件)
- 找到最有效的应对关系
- 找到最好的方法很好的方法从服务器查询
好的,所以我注意到一些事情:一,你不能将我的客户端变量传递到视图,所以使用这样的方法将无法正常工作。二,我认为可能会有所有的帖子,然后检查类型是否发布,然后返回匹配的文档,但这似乎有很多数据移动。
一些代码:
所以我如何使用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
这会给你所有与该用户相关联的视图文件。
就像Will Hartung所说的那样,你需要一个观点,但它应该看起来有点不同于Will的表现。
首先确保您想要发射的字段存在。请记住,null
和0
是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 =真
伟大的回应。我稍微改变了威尔(实际上它现在看起来和你的一样),但它指出了我正确的方向! – film42 2012-07-29 22:19:13
干杯!那就是诀窍。非常感谢! – film42 2012-07-29 04:36:45