首页 > nodejs 关联查询

nodejs 关联查询

node新手请教一个问题。
我正在做一个微博系统,mongodb里插入了2个文档:user和article,user保存用户信息,article保存文章信息。
如下图!

用户的uid是不可以更改的,name可以更改,所以article文档中只存储了作者的uid,而没有存name。
那么问题来了,我如何在查询这个文章的时候将作者的name也找出来呢?谢谢解惑


直接保存了name信息


这种情况我一般是把name字段也存到article表里,当然只是治标不治本的方法...


mongo这种非关系型数据库,是鼓励你用多条查询来拼结果的。先把文章那条记录查出来,然后取出uid的值,去用户集合里查出用户信息。当然,如果不是设置uid作为主键的话,可以给uid建个索引


没看到你article里面的uid这一项,但我想这不是问题,肯定要有的。
操作mongodb我一般喜欢用mongoose,这里需要mongoose的populate操作
首先在定义model的时候在article里面定义
uid:{type:mongoose.Schema.Types.ObjectId,ref:'User'}

然后查询的时候

ArticleModel
    .findById(__theArticleId)
    //下面第一个populate是最简单的populate,就是指明要populate什么东西,以及取出被populate的东西的哪些项目
    .populate('uid','name')
    //下面这个是一个复杂一些的深层populate
    .populate({
        //你还可以populate与article相关的文档里的另一个东西
        //比如一个article有一个category,category里面有这个分类下面的热门用户的id
        //你先populate这个article的category
        //并且指明获得category的description和hotUserIds,
        //然后再populate这些hotUserIds,并且指明请求hotUser们的name
         path: 'category',
         select: 'description hotUserIds',
         populate:{
             path:'hotUserIds',
             select: 'name'
         }
    })
    .exec(function(err,article){
        //do something
    })

使用DBRef在存储的时候进行关联
假如user存储的ObjectID为:57574e3f33de6266b5845052c02c

在article写入这样操作:

var Ba={author:[new DBRef('user',ObjectId("57574e3f33de6266b5845052c02c"))],title:"xxx",.....}  
db.article.insert(Ba) 

在查询article时就可以读取到author对象了

【热门文章】
【热门文章】