CouchDB在Node.js中获取来自用户的所有帖子

CouchDB getting all posts from user in Node.js

本文关键字:用户 Node js 获取 CouchDB      更新时间:2024-04-28

我首先会说我做了很多研究,但我仍然很迷茫。

我有一个工作版本,但我相信这是最低效的方法。我对知道规划DB的最佳方式不是很有信心,很明显,我已经变得依赖ActiveRecord了。无论如何,我只是想弄清楚这些事情:

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

好吧,我注意到了一些事情:第一,您不能将I客户端变量传递到视图中,所以使用这样的方法是行不通的。第二,我认为可能需要获取所有帖子,然后检查类型是否为帖子,然后返回匹配的文档,但这似乎有很多数据在移动。

部分代码:

所以我使用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"
}

以下是我目前获取所有帖子的方式(真的很糟糕!):

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

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

谢谢你的帮助!!

您确实想要使用视图。只需在帖子上创建以用户为关键的视图。

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的显示方式有所不同。

首先,请确保要发射的字段存在。请记住,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=trueURL参数。

因此,基本上,如果您将null作为一个值发出,那么您就会得到这样的文档。

是否获取/yourdb/design/app/_view/by_user?key=film42&include_docs=真正的