mongoose之Model相关的操作

假设以下代码都运行在

let mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
let db = mongoose.connection;
db.on('error', () => {
  console.error('链接失败');
});
db.once('open', function () {
  //下面讲到的所有代码都在这里运行
});

increment

增加文档版本号

//一开始的版本号_v是0
let query = Person.findOne({ name: 'noshower' }, function (err, person) {
    person.increment();
    person.save(function (err, parent) {
        if (err) {
            return console.error(err);
        }
    //现在_v是1
    });
});

remove

从db中删除此文档。

 Person.findOne({name:'noshower'},function(err,result){
    if(err){
        return console.error(result);
    }
    console.log(result);//{ _id: 587a02251d73bb1ec61ace04, name: 'noshower',age: 22,occupation: 'teacher',__v: 1 }
    result.remove(function(err,result){
        if(err){
            return console.error(err);
        }
        Person.findById(result._id,function(err,result){
            if(err){
                return console.error(err);
            }
            console.log(result); //null 被删了
        })
    });
});

model(name)

返回另一个Model实例

 let Schema = mongoose.Schema;
let schema = new Schema({
    name: String,
    age: Number,
    occupation: String
});
let Person = mongoose.model('Person', schema);
let Woman = mongoose.model('Woman', schema);
Woman.model('Person').findById('587a0234a693c31ed46c4885',function(err,result){
    if(err){
        return console.error(err);
    }
    console.log(result);
});

save([fn])

保存此文档

let Schema = mongoose.Schema;
let schema = new Schema({
    name: String,
    age: Number,
    occupation: String
});
let Person = mongoose.model('Person', schema);
let person = new Person({
    name:'马克',
    age:24,
    occupation:'programmer'
});
person.save(function(err,product,numberAffected){
    if(err){
        return console.error(err);
    }
    console.log(numberAffected); //1
});

回调将接收三个参数,err如果发生错误,product是保存的product,numberAffected,当文档在数据库中找到和更新时,为1,否则为0。

fn callback是可选的。如果没有传递fn并且验证失败,那么将在用于创建此模型的连接上发出验证错误。

  let db = mongoose.createConnection(..);
  let schema = new Schema(..);
  let Product = db.model('Product', schema);
  db.on('error', handleError);

然而,如果你想要更多的本地错误处理,你可以添加一个error监听器到模型,并处理错误。

Product.on('error', handleError);

count

计算数据库集合中匹配的文档数。

let Schema = mongoose.Schema;
let schema = new Schema({
    name: String,
    age: Number,
    occupation: String
});
let Person = mongoose.model('Person', schema);
Person.count({name:'noshower'},function(err,count){
    if(err){
        return console.error(err);
    }
    console.log(count);//2 说明数据库中,叫“noshower”的person有两个
});

create

用于创建新文档的快捷方式,如果有效,将自动保存到数据库。

 Person.create({name:'Ali'},{name:'PengHu'},function(err,person1,person2){
   if(err){
       return console.error(err);
   }
// 生成了两个文档
   console.log(person1);//{ __v: 0, name: 'Ali', _id: 587a3c2e09a15c236e3fca37 }
   console.log(person2);// { __v: 0, name: 'PengHu', _id: 587a3c2e09a15c236e3fca38 }
 });
//传递一个数组
let array = [{
    name:'高虎'
},{
    name:'林俊杰'
}];
//此时回调函数接受到只有两个参数,一个是err,另一个person1。person2是undefined
Person.create(array,function(err,person1,person2){
    if(err){
        return console.error(err);
    }
    console.log(person1);//[ { __v: 0, name: '高虎', _id: 587a3d3cdf8cc623a034de09 },{ __v: 0, name: '林俊杰', _id: 587a3d3cdf8cc623a034de0a } ]
    console.log(person2); // undefined
});

distinct

为不同操作创建查询

let Schema = mongoose.Schema;
let schema = new Schema({
    name: String,
    age: Number,
    occupation: String
});
let Person = mongoose.model('Person',schema);
//找到数据库所有age=22的文档,并将name字段值以数组形式返回
Person.distinct('name',{age:22},function(err,result){
    if(err){
        return console.error(err);
    }
    console.log(result);//[ '李寻欢', '爱因斯坦', 'noshower' ]
});
let query = Person.distinct('url');
query.exec(function(){
    console.log('ok')
});

find

查找文档

Model.find(conditions,fields,options,callback);

在发送命令之前,conditions将转换为它们各自的SchemaTypes。

//查找年龄至少24
Person.find({age:{$gte:24}},function(err,result){
    if(err){
        return console.error(err);
    }
    console.log(result);
});
//查找年龄至少24,仅选择name字段。
Person.find({age:{$gte:24}},'name',function(err,result){
    if(err){
        return console.error(err);
    }
    console.log(result);
});
//  查找年龄至少24,仅选择name字段,且跳过两个
Person.find({age:{$gte:22}},"name",{skip:2},function(err,result){
    if(err){
        return console.error(err);
    }
    console.log(result);
});

findById

按id查找单个文档。
Model.findById(id,fields,options,callback);

//选择name字段
Person.findById('587a3aae75b3c5758ca6877d',"name",function(err,person){
    if(err){
        return console.error(err);
    }
    console.log(person);
});

findByIdAndRemove

Model.findByIdAndRemove(id,[options],[callback])

查找匹配的文档,将其删除,将找到的文档(如果有)传递到回调。 如果传递了callback,则立即执行,否则返回Query对象。

//
A.findByIdAndRemove(id, options, callback) // 立即执行
executesA.findByIdAndRemove(id, options) // 返回query
QueryA.findByIdAndRemove(id, callback) // 立即执行
executesA.findByIdAndRemove(id) // 返回 query
QueryA.findByIdAndRemove()  //返回query

findByIdAndUpdate

  Model.findByIdAndUpdate(id, [update], [options], [callback])

找到匹配的文档,根据update变量更新它,传递任何选项,并将找到的文档(如果有)返回到回调。如果回调被传递,则查询立即执行,否则返回一个Query对象。

Options:

  • new : true 返回修改的文档而不是原始文档。默认为true
//将new设置为false,将返回原始文档
    Person.findByIdAndUpdate('587a3aae75b3c5758ca6877d',{name:'光环'},{new:false},function(err,person){
    if(err){
        return console.error(err);
    }
    console.log(person);
    });
  • upsert:false 如果对象不存在,则创建对象。默认为false

     //查找的id并不存在,将upsert设置为true,此时将创建对象
    Person.findByIdAndUpdate('587a3aae75b3c5758ca687dd',{name:'光环'},{upsert:true},function(err,person){
     if(err){
         return console.error(err);
     }
     });
    
  • sort 如果按照条件找到多个文档,请设置排序顺序以选择要更新的文档

  • select 设置要返回的文档字段

Model.findOne

查找一个文档

Model.findOne(conditions, [fields], [options], [callback])

在发送命令之前,conditions将转换为它们各自的SchemaTypes。

//查找name是noshower的文档,返回name字段
Person.findOne({name:'noshower'},'name',function(err,person){
  if(err){
      return console.error(err);
  }
  console.log(person);
});

findOneAndRemove

Model.findOneAndRemove(conditions, [options], [callback])

查找匹配的一个文档,将其删除,将找到的文档(如果有)传递到callback。 如果回调函数被传递,则立即执行;否则返回一个Query对象。

findOneAndUpdate

 Model.findOneAndUpdate([conditions], [update], [options], [callback])

remove

Model.remove(conditions, [callback])

从集合中删除文档。

// 删除所有name=“光环”的文档
Person.remove({name:'光环'},function(err){
    if(err){
        return console.error(err);
    }
});
 //remove如果在document上调用,表示删除这条文档。z在model上调用,表示删除所有匹配的文档。
person.remove(function(err,person){
})

要删除文档而不等待MongoDB的响应,不要传递回调,然后在返回的Query上调用exec:

let query = Person.remove({ _id: id });
query.exec();

此方法直接向MongoDB发送一个remove命令,不涉及Mongoose文档。因为不涉及Mongoose文档,所以不执行中间件(hook)。

update

 Model.update(conditions, update, [options], [callback]

更新数据库中的文档而不返回它们。

//更新所有年龄在18岁以上的文档,职业更新为cleaner

 Person.update({age:{$gte:18}},{occupation:'cleaner'},{multi:true},function(err,numberAffected,raw){
    if(err){
        return console.error(err);
    }
    console.log(numberAffected);
    console.log(raw);
});

Valid options:

  • safe (boolean)安全模式(默认为在schema中设置的值(true))
  • upsert (boolean) 是否创建文档如果它不匹配(false)
  • multi (boolean) 是否应更新多个文档(false)
  • strict (boolean) 覆盖此更新的strict选项
  • overwrite (boolean) 禁用仅更新模式,允许您覆盖doc(false)

回调函数接收(err,numberAffected,rawResponse)

  • err 是错误如果错误发生
  • numberAffected是Mongo报告的更新文档的数量
  • rawResponse是Mongo的完整响应

where

创建查询,应用已通过的条件,并返回查询。

Model.where(path, [val])

User.find({age: {$gte: 21, $lte: 65}}, callback);
//也可以这样
User.where('age').gte(21).lte(65).exec(callback);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容