1. 程式人生 > >mongoose模糊查詢及聯表查詢等

mongoose模糊查詢及聯表查詢等

原文地址:https://segmentfault.com/a/1190000006126679

mongoose的一些高階用法:

1 populate聯表查詢

首先,我們定義三個Schema

複製程式碼
drawApply = new Schema({
    salesId: { type: Schema.ObjectId, ref: 'sales' },
    money: Number,
    status: { type: Number, default: 0 },
    createTime: { type: Date, default: Date.now }
});

sales = new Schema({
    name: { type: String, required: 
true, unique: true }, pwd: String, phone: String, merchant: { type: Schema.ObjectId, ref: 'merchant' }, status: { type: Number, default: 0 } }); merchant = new Schema({ name: String, sname: String, type: String });

  返回的結果中除了drawApply表的資料外,還會包含salesId中_id,name,phone,merchant四個屬性的值(注:需要檢視什麼屬性就在第二個引數中明示,若populate方法中只有salesId引數,則會將sales表中所有屬性返回)。但是merchant屬性的值是以

ObjectId的形式顯示的,如果想知道對應的merchant其它屬性的值,則需要再次使用到巢狀的populate。程式碼如下:

複製程式碼
drawApply.find().populate({
    path: 'salesId',
    select: '_id name phone merchant',
    model: 'sales',
    populate: {
        path: 'merchant',
        select: '_id sname',
        model: 'merchant'
    }).sort({createTime: -1}).exec(function
(err, list) { // list of drawApplies with salesIds populated and merchant populated });
複製程式碼

  如果drawApply表中還存在其它ObjectId型別的欄位,則可以在populate方法後面繼續跟其它的populate,使用方法相同,如:

複製程式碼
drawApply.find().populate({
    path: 'salesId',
    select: '_id name phone merchant',
    model: 'sales',
    populate: {
        path: 'merchant',
        select: '_id sname',
        model: 'merchant'
    })
    .populate('approver', 'name')//這裡是簡寫方式, {path:'approver',select:'name'}
    .populate('operator', 'name')
    .sort({createTime: -1}).exec(function(err, list) {
  // list of drawApplies with salesIds populated and merchant populated
});

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      .skip(10) //跳過前10條
      .limit(10)  //限制10條記錄      .sort({time:-1})  //根據time的倒序排.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);
        }
      })