nodemongoDB

mongoose之Model相关的操作

2017-01-15  本文已影响3161人  打铁大师

假设以下代码都运行在

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设置为false,将返回原始文档
    Person.findByIdAndUpdate('587a3aae75b3c5758ca6877d',{name:'光环'},{new:false},function(err,person){
    if(err){
        return console.error(err);
    }
    console.log(person);
    });

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:

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

where

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

Model.where(path, [val])

User.find({age: {$gte: 21, $lte: 65}}, callback);
//也可以这样
User.where('age').gte(21).lte(65).exec(callback);
上一篇下一篇

猜你喜欢

热点阅读