MongoDB学习笔记(四)——CRUD之 删除

8、如何删除文档?


语法格式:db.colection.remove(<query>, <justone>);


对应与SQL中的DELETE语句,<query>相当于where条件,<justone>相当于limit 1。

  • 只有当<justone>的值为true或1时,只删除第一条符合条件的文档

> db.zyv.find();

{ "_id" : ObjectId("50c890633c5d2c447b69b483"), "title" :"google" }

{ "_id" : ObjectId("50c890633c5d2c447b69b484"), "title" :"google" }

{ "_id" : ObjectId("50c890633c5d2c447b69b485"), "title" :"google" }

> db.zyv.remove({title:'google'},1);

> db.zyv.find();

{ "_id" : ObjectId("50c890633c5d2c447b69b484"), "title" : "google" }

{ "_id" : ObjectId("50c890633c5d2c447b69b485"), "title" : "google" }


示例中集合zyv中有3个title为”google”的文档,当调用 db.zyv.remove({title:'google'},1);后,只删除了第一个符合条件的文档,集合 zyv中还剩下两个title为”google”的文档。


  • <query>的值可以包含正则表达式,如:

> db.bios.remove( { ’name.first’ : /^G/ } );


则是删除子文档name中first属性以G开头的所有文档。


  • 原子操作:当<query>参数匹配多个文档时,remove的删除操作并不是原子操作,即:所有匹配文档的删除并不是事务性的,对于大数据量来说,在删除的过程中也可能其他进程正在读取数据,这将导致数据的不一致。使用$atomic选项可以强制将所有匹配的删除作为一个原子操作来处理:

> db.zyv.remove( { title: ‘google’, $atomic: 1 } );



  • 清空表数据。remove()方法根据<query>参数删除符合条件的文档。如果不传参数<query>,则删除所有记录(OMG !再次牢记“慎重”!)。所以remove() 相当于SQL 里面的delete * 。如果要快速删除集合及集合的索引,可以使用db.collection.drop()方法, 相当于SQL 里面的drop table 。

  > db.zyv.drop();

  true


如果集合zyv存在(不管是否有文档),drop()方法操作完成都会返回true,如果集 合不存在,则返回false。


  • drop ()优先于remove()。当需要清空集合数据时,drop()方法有比remove()方法更高的效率,同时还可以清除已有的索引。在SQL中,我们清空表用DELETE *而不使用drop,因为我们需要保留表的结构(列、索 引、约束),而在NoSQL中集合是无结构的,不会有这样的顾虑,因此首选drop()  。

猜你喜欢

转载自zhiyongv.iteye.com/blog/1746769