关于 javascript:CouchDB 在 Node.js 中获取用户的所有帖子

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 显示的有点不同。

    首先确保您要发出的字段存在。请记住,null0 在 JavaScript 中是虚假值,因此根据您的数据结构,您可能必须明确检查字段是否为 undefined

    这里有一些代码可以告诉你我的意思。

    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,因为无论如何这都会自动发生。还要确保不要发出整个文档 emit(doc.user, doc);。那是低效的。如果您需要整个文档,只需发出 null 作为值并使用 include_docs=true URL 参数。

    所以基本上如果你发出 null 作为一个值,那么你会得到这样的文档。

    GET /yourdb/_design/app/_view/by_user?key=film42&include_docs=true