mongoose的一些高级用法:
1 populate(中文:移民)的用法
在mongodb中没有关联查询这一说,因此必须就要先设置好相关联的对象
比如,我们在ZonePrice中就就先定义一个Zone对象
var ZonePriceSchema = new mongoose.Schema({
zone:{type:ObjectId, ref:'Zone'},
time: String, //时间
price: Number, //价格
district:String, //区域
})
而后使用populate把相关联的zone查询出来
ZonePrice.find({})
.populate({
path:'zone',
match:{priceRate:{$gt:0}},
options:{ limit:pageSize,
skip:(pageNum-1)*pageSize }
})
当然,mongoose也是支持内嵌数组对象的
你可以把他定义为
someSchema({
...
ofObjectId: [Schema.Types.ObjectId],
...
})
2 复杂查询
以下是一个复杂查询,基本包括了所有的查询用法
Person
.find({ occupation: /host/ })
.where('name.last').equals('Ghost') // Person.name.last是Ghost
.where('age').gt(17).lt(66) // 17 < Person.age <66
.where('likes').in(['vaporizing', 'talking'])//likes是vaporizing或者talking
.limit(10) //限制10条记录
.sort('-occupation') //根据occupation的倒序排
.select('name occupation') //选择name和occupation字段
.exec(callback);
3 模糊匹配
有时候在项目中需要搜索功能,而搜索功能的实现必须用模糊匹配,这个时候可以使用or进行多字段匹配,但速度比较慢,大系统最好使用专业的搜索方法
or表示在数组里的条件满足一个即可,$regex表示一个正则表达式,匹配了key,同时,加入了$option的$i表示忽略大小写
Job.find({
$or: [
{'description': {'$regex': key, $options: '$i'}},
{'city': {'$regex': key, $options: '$i'}},
{'name': {'$regex': key, $options: '$i'}}]
})
.populate('JobType', 'name')
.exec(function (err, jobs) {
if (err) {
callback(err);
} else {
callback(null, jobs);
}
})