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对象了