2

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

我有一个工作版本,但我敢肯定,这是你能做到的最低效的方式。我对知道计划数据库的最佳方法不是很有信心,很明显,我已经变得依赖 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);
    });
});

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

谢谢您的帮助!!

4

2 回答 2

2

你真的想使用视图。只需以用户为键在帖子上创建视图。

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

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

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

这将为您提供与该用户关联的所有查看文档。

于 2012-07-29T04:24:19.907 回答
0

就像 Will Hartung 所说的,你想要一个视图,但是它看起来应该与 Will 展示的有点不同。

首先确保您要发出的字段存在。请记住,nulland0是 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=true

于 2012-07-29T08:29:06.657 回答