文档删除

  有三种方法用于文档删除



remove()

findOneAndRemove()

findByIdAndRemove()

【remove()】

  remove有两种形式,一种是文档的remove()方法,一种是Model的remove()方法

  下面介绍Model的remove()方法,该方法的第一个参数conditions为查询条件,第二个参数回调函数的形式如下function(err){}  

model.remove(conditions, [callback])
 

  删除数据库中名称包括'30'的数据

temp.remove({name:/30/},function(err){})
 

  [注意]remove()方法中的回调函数不能省略,否则数据不会被删除。当然,可以使用exec()方法来简写代码

temp.remove({name:/30/}).exec()
 

  下面介绍文档的remove()方法,该方法的参数回调函数的形式如下function(err,doc){}

document.remove([callback])
 

  删除数据库中名称包含'huo'的数据

  [注意]文档的remove()方法的回调函数参数可以省略

复制代码



temp.find({name:/huo/},function(err,doc){

doc.forEach(function(item,index,arr){

item.remove(function(err,doc){

//{ _id: 5971f93be6f98ec60e3dc86c, name: 'huochai', age: 30 }

//{ _id: 5971f93be6f98ec60e3dc86e, name: 'huo', age: 60 }

console.log(doc);

})

})

})

复制代码

【findOneAndRemove()】

  model的remove()会删除符合条件的所有数据,如果只删除符合条件的第一条数据,则可以使用model的findOneAndRemove()方法

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

   集合temps现有数据如下

  现在删除第一个年龄小于20的数据



temp.findOneAndRemove({age:{$lt:20}},function(err,doc){

//{ _id: 5972d3f3e6f98ec60e3dc873, name: 'wang', age: 18 }

console.log(doc);

})
 

  与model的remove()方法相同,回调函数不能省略,否则数据不会被删除。当然,可以使用exec()方法来简写代码

temp.findOneAndRemove({age:{$lt:20}}).exec()
 

【findByIdAndRemove()】

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

  删除第0个元素

复制代码



var aIDArr = [];

temp.find(function(err,docs){

docs.forEach(function(item,index,arr){

aIDArr.push(item._id);

})

temp.findByIdAndRemove(aIDArr[0],function(err,doc){

//{ _id: 5972d754e6f98ec60e3dc882, name: 'huochai', age: 27 }

console.log(doc);

})

})
 

复制代码

  类似的,该方法也不能省略回调函数,否则数据不会被删除。当然,可以使用exec()方法来简写代码

复制代码



var aIDArr = [];

temp.find(function(err,docs){

docs.forEach(function(item,index,arr){

aIDArr.push(item._id);

})

temp.findByIdAndRemove(aIDArr[0]).exec()

})
 

复制代码

 

前后钩子

  前后钩子即pre()和post()方法,又称为中间件,是在执行某些操作时可以执行的函数。中间件在schema上指定,类似于静态方法或实例方法等

  可以在数据库执行下列操作时,设置前后钩子

复制代码



init

validate

save

remove

count

find

findOne

findOneAndRemove

findOneAndUpdate

insertMany

update
 

复制代码

【pre()】

  以find()方法为例,在执行find()方法之前,执行pre()方法

复制代码



var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});

schema.pre('find',function(next){

console.log('我是pre方法1');

next();

});

schema.pre('find',function(next){

console.log('我是pre方法2');

next();

});

var temp = mongoose.model('temp', schema);

temp.find(function(err,docs){

console.log(docs[0]);

})

/*

我是pre方法1

我是pre方法2

{ _id: 5972ed35e6f98ec60e3dc886,name: 'huochai',age: 27,x: 1,y: 2 }

*/

复制代码

【post()】

  post()方法并不是在执行某些操作后再去执行的方法,而在执行某些操作前最后执行的方法,post()方法里不可以使用next()

复制代码



var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});

schema.post('find',function(docs){

console.log('我是post方法1');

});

schema.post('find',function(docs){

console.log('我是post方法2');

});

var temp = mongoose.model('temp', schema);

temp.find(function(err,docs){

console.log(docs[0]);

})

/*

我是post方法1

我是post方法2

{ _id: 5972ed35e6f98ec60e3dc886,name: 'huochai',age: 27,x: 1,y: 2 }

*/

 

 

学完还想练?点这里!