9

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);
        }
      })

方老司
2k 声望224 粉丝

教育皆祸害,[链接]