zoukankan      html  css  js  c++  java
  • 85.Mongoose指南

    转自:https://www.bbsmax.com/A/pRdBnKpPdn/

    定义schema

    用mongoose的第一件事情就应该是定义schema. schema是什么呢? 它类似于关系数据库的表结构.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var mongoose = require('mongoose');
    var schema = mongoose.Schema;
     
    var blogSchema = new Schema({
        titile: String,
        body: String,
        comments: [{body: String, date: Date}],
        date: {type: Date, default: Date.now},
        hidden:Boolen
    });

    创建model

    格式是mongoose.model(modelName, schema);

    1
    var BlogModel = mongoose.model('Blog', blogSchema);

    实例化方法

    model的实例是document. document有许多内置的实例方法. 我们可以为document定义自己的实例方法

    1
    2
    3
    4
    5
    6
    var animalSchema = new Schema({name: String, type: String});
     
    //定义实例方法
    animalSchema.methods.findSimilarType = function(cb){
      return this.model('Animal').find({type: this.type}, cb);
    }

    现在animal实例有findSimilarTypes方法了

    1
    2
    3
    4
    5
    6
    var Animal = mongoose.model('Animal', animalSchema);
    var dog = new Animal({type: 'dog'});
     
    dog.findSimilarTypes(function(err, dogs){
      console.log(dogs);
    });

    Model静态方法

    还可以给Model添加静态方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    animalSchema.statics.findByName = function(name, cb){
       this.find({name: new RegExp(name, 'i')}, cb);
    }
     
     
    var Animal = mongoose.model('Animal', animalSchema);
     
    Animal.findByName('fido'function(err, animals){
      console.log(animals);
    });

    索引

    索引分为field级别和schema级别. 如果使用复合索引那么必须使用schema索引

    1
    2
    3
    4
    5
    6
    7
    var animalSchema = new Schema({
       name: String,
       type: String,
       tags: {type: [String], index:true// field level
    });
     
    animalSchema.index({name:1, type:-1}); // schema level

    当应用启动的时候, mongoose会自动为你的schema调用ensureIndex确保生成索引. 开发环境用这个很好, 但是建议在生产环境不要使用这个.使用下面的方法禁用ensureIndex

    1
    2
    3
    animalSchema.set('autoIndex'false);
    //or
    new Schema({}, {autoIndex: false});

    Virtual

    virtual是document的属性 你可以get,set他们但是不持续化到MongoDB. virtual属性get非常有用可以格式化或者合并字段,  set可以分解一个字段到多个字段并持续化到数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var personSchema = new Schema({
        name: {
            first: String,
            last: String
        }
    });
     
     
    var Person = mongoose.model('Person', personSchema);
     
    var bad = new Person({
       name: {first: 'Walter', last: 'White'}
    });

    如果你想获取bad的全名 你需要这样做

    1
    console.log(bad.name.first + ' ' + bad.name.last);

    或者我们可以在personSchema中定义virtual getter. 这样我们就不需要在每个要用fullname的地方拼接字符串了

    1
    2
    3
    personSchema.virtual('name.full').get(function(){
        return this.name.first + ' ' this.name.last; 
    );

    现在我么可以使用 name.full虚属性了

    1
    console.log(bad.name.full);

    我们还可以通过设置this.name.full来设置this.name.first和this.name.last

    1
    bad.name.full = "Breaking Bad";
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    personSchema.virtual('name.full').set(function(name){
       var split = name.split(' ');
       this.name.first = split[0];
       this.name.last = split[1];
    });
     
     
     
    mad.name.full = "Breaking Bad";
    console.log(mad.name.first); // Breaking
    console.log(mad.name.last); // Bad

      

     Options

    Schema有一些配置选项, 可以如下面一样设置

    1
    2
    3
    4
    5
    new Schema({}, options);
     
    //or
    var xxSchema = new Schema({});
    xxSchema.set(option, value);

    option:autoIndex

    应用启动的时候Mongoose会自动为每一个schema发送一个ensureIndex命令。  如果你想禁止自动创建index要自己手动来创建的话 你可以设置autoIndex为false

    1
    2
    3
    4
    var xxSchema = new Schema({}, { autoIndex: false });
     
    var Clock = mongoose.model('Clock', xxSchema);
    Clock.ensureIndexs(callback);

    option:bufferCommands

    todo

    1
    var schema = new Schema({}, { bufferCommands: false });

    option:capped

    todo 

    ....

  • 相关阅读:
    单列模式
    经济数据价格走势图(包括纸黄金),可以查看历史
    UVA10010的类似BFS做法
    转:数据结构专项之Hash函数
    ZOJ1709 DFS和BFS两种搜索方法
    HDU1969(二分搜索)
    HDU1045 回溯
    HDU2899(三分搜索)
    安神口中的水题
    HDU2199(二分搜索无限逼近)
  • 原文地址:https://www.cnblogs.com/sharpest/p/8214068.html
Copyright © 2011-2022 走看看