Javascript CouchDB从Node.js中的用户获取所有帖子

Javascript CouchDB从Node.js中的用户获取所有帖子,javascript,node.js,database-design,couchdb,couchdb-nano,Javascript,Node.js,Database Design,Couchdb,Couchdb Nano,首先,我要说我做了很多研究,但我还是很迷茫 我有一个工作版本,但我相信这是最低效的方法。我对知道设计数据库的最佳方法不是非常自信,很明显,我已经开始依赖ActiveRecord了。不管怎样,我只是想弄明白这些事情: 找出规划数据库的最佳方法(我应该如何分隔文档) 找到处理关系最有效的方法 找到从服务器查询的好方法 好的,我注意到了一些事情:第一,不能将I客户机变量传递到视图中,所以使用这样的方法是行不通的。第二,我认为可能需要获取所有帖子,然后检查类型是否为post,然后返回匹配的文档,但这似乎

首先,我要说我做了很多研究,但我还是很迷茫

我有一个工作版本,但我相信这是最低效的方法。我对知道设计数据库的最佳方法不是非常自信,很明显,我已经开始依赖ActiveRecord了。不管怎样,我只是想弄明白这些事情:

  • 找出规划数据库的最佳方法(我应该如何分隔文档)
  • 找到处理关系最有效的方法
  • 找到从服务器查询的好方法
  • 好的,我注意到了一些事情:第一,不能将I客户机变量传递到视图中,所以使用这样的方法是行不通的。第二,我认为可能需要获取所有帖子,然后检查类型是否为post,然后返回匹配的文档,但这似乎需要大量数据

    一些代码:

    所以我使用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"
    }
    
    用户文档:

    {
    "_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"
    }
    
    下面是我目前获取所有帖子的方式(这真的很糟糕!)

    函数buildUserPostArray(数组、用户、res、i){
    db.get(user.posts[i],函数(err,post_obj){
    如果(i
    我一直在使用视图,直到我意识到我不能传递一个变量,然后我查看了列表,但在阅读了许多教程后,我迷路了


    谢谢你的帮助

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

    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中是错误的值,因此根据您的数据结构,您可能需要明确检查字段是否
    未定义

    这里有一些代码来告诉你我的意思

    function(doc) {
        if (doc.user && doc.title) { // This check is important
            emit(doc.user, {title: doc.title, date: doc.date});
        }
    }
    
    您不必显式地发出doc ID,因为这会自动发生。还要确保不发出整个文档
    emit(doc.user,doc)。这是低效的。如果需要整个文档,只需发出
    null
    作为值,并使用
    include\u docs=true
    URL参数即可

    因此,基本上,如果您将
    null
    作为一个值发出,那么您将得到如下文档

    GET/yourdb/\u design/app/\u view/by\u user?key=film42&include\u docs=true


    反应很好。我稍微改变了威尔的(实际上现在看起来像你的),但它为我指明了正确的方向!