Mongodb实现的关联表查询功能【population方法】
本文实例讲述了Mongodb实现的关联表查询功能。分享给大家供大家参考,具体如下:
Population
MongoDB是非关联数据库。但是有时候我们还是想引用其它的文档。这就是population的用武之地。
Population是从其它文档替换文档中的特定路径。我们可以迁移一个单一的文件,多个文件,普通对象,多个普通的对象,或从查询中返回的所有对象
populate方法
populate方法可以用在document上、model上或者是query对象上,这意味着你几乎可以在任何地方调用这个方法以填充你的引用字段。
当然,populate方法在不同对象上参数不大一样,但是都接收一个option的参数,你可以用这些参数指定:
语法:Query.populate(path,[select],[model],[match],[options])
path:以空格分隔的引用字段的名称String或Object类型,
String类型的时,指定要填充的关联字段,要填充多个关联字段可以以空格分隔。
Object类型的时,就是把populate的参数封装到一个对象里。当然也可以是个数组
select:Object或String,可选,指定填充document中的哪些字段。
Object类型的时,格式如:{name:1,_id:0},为0表示不填充,为1时表示填充。
String类型的时,格式如:"name-_id",用空格分隔字段,在字段名前加上-表示不填充。详细语法介绍query-select
match:可选,指定附加的查询条件
model:可选,指定关联字段的model,如果没有指定就会使用Schema的ref
options: Object可选,指定附加的其他查询选项,如排序以及条数限制等等
引用字段的类型
目前,Mongoose只支持以下几种引用字段的类型:
ObjectId
Number
String
Buffer
而且自然而然,引用document的主键类型必须和引用字段类型相对应。在生产环境中,推荐主键类型和引用类型都使用ObjectId,一是因为ObjectId不包含业务含义,二是ObjectId不大可能重复,三是因为Mongoose默认生成的主键类型就是ObjectId,可以减少很多配置的操作。
例子
Scheme先定义好,关联属性
AScheme:
varmongoose=require('mongoose'); varSchema=mongoose.Schema; varAScheme=newSchema({ name:{ type:String, default:'' } },{collection:'a'}); module.exports=mongoose.model('A',CountSchema);
BScheme:
varmongoose=require('mongoose'); varSchema=mongoose.Schema; varBScheme=newSchema({ name:{ type:String, default:'' }, age:{ type:Number } aid:{ type:mongoose.Schema.ObjectId,//如果AScheme的_idtype为String,这里对应写String ref:'A' } },{collection:'b'}); module.exports=mongoose.model('B',CountSchema);
关联查询
AModel.find().populate({path:'aid',select:{name:1,_id:0}}).exec(function(err,a){ if(err)res.send(err); console.log(a); }); // AModel.find(...).populate({path:'aid',match:{age:{$gte:21}},select:'name-_id',options:{limit:5}}).exec()
更多相关内容还可参考:http://mongoosejs.com/docs/api.html#model_Model.populate
希望本文所述对大家MongoDB数据库程序设计有所帮助。