关于Mongoose的小知识

  • Post author:
  • Post category:其他


创建collection

比如,我需要建立一个collection来存储有关各种建筑领域有关的信息。name代表名称,code代表编码,scope代表领域

var mongoose = require('mongoose');

var Schema = mongoose.Schema;


var ScopeSchema = Schema(
    {
        name:{type:String},
        code: {type: String},
        scope: {type: String}
    }
);
//Export model
module.exports = mongoose.model('AllScope', ScopeSchema);

要注意的是这样创建出来的collection实际上在MongoDB中名称是’AllScopes’,

mongoose会自动把你传入的这个参数变成复数

。因此,如果强行不想变成复数的名字,最后一行可以这样写:

module.exports = mongoose.model('AllScope', ScopeSchema, 'AllScope');

避免一个重复的字段—使用virtual

现在AllScope表中有三个字段,如果需要一个url字段代表一个构件的访问地址,这个地址由code和scope字段根据某种规则拼接而成,这种字段我们一般不会再声明schema的时候给出一个url字段,这不利于查出url的错误,也不符合数据库设计理念,这时我们会使用virtual来解决。

ScopeSchema
    .virtual('url')
    .get(function () {
        return '/allscope/' + this.scope+"-"+this.code;
    });

拒绝一个colletion中出现重复的元素

当我们有一个关系表时,表中只有两个字段:元素A的ID和元素B的ID。经常我们不希望里面的数据发生重复,如果只要求其中一个字段不重复时很简单,在声明schema时,对应字段加上unique即可。那如果是两个字段合起来不可以重复呢?这时我们需要Unique Index

var mongoose = require('mongoose');

var Schema = mongoose.Schema;


var MatchSchema = Schema(
    {
        ifc:{type:String},
        ifd: {type: String}
    }
);

MatchSchema.index({ ifc: 1, ifd: 1 }, { unique: true });

这时,如果开始我们的表中什么都没有

insert {ifc:'a', ifd:'b'} //true
insert {ifc:'a', ifd:'c'} //true
insert {ifc:'d', ifd:'b'} //true
insert {ifc:'a', ifd:'b'} //false

查看表中是否有某个元素

    CollectionName.find({scope: "a", code: "b"}, function(err, result) {            
        if(err || !result.length) {
            //没找到或者出错了

        } else {
            //找到了

        }
    });

注意:不要丢掉err参数哦



版权声明:本文为littleorange6原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。