MongoDB教程13-MongoDB删除文档
在前面我们已经学习了MongoDB中如何为集合添加数据和更新数据。在本章节中我们将继续学习MongoDB集合的删除。
MongoDB 使用 remove() 和 delete() 方法来删除集合中的文档。
MongoDB remove()函数是用来移除集合中的数据。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
MongoDB数据更新可以使用update()函数。
remove() 方法
如果不再需要 MongoDB 中存储的文档,可以通过删除命令将其永久删除。删除 MongoDB 集合中的数据可以使用 remove() 函数。
remove() 函数可以接受一个查询文档作为可选参数来有选择性地删除符合条件的文档。删除文档是永久性的,不能撤销,也不能恢复。因此,在执行 remove() 函数前最好先用 find() 命令来查看是否正确
remove() 方法的基本语法格式如下所示:
db.collection.remove( <query>, { justOne: <boolean>,
writeConcern: <document> } )
参数说明:
- query:必选项,是设置删除的文档的条件。
- justOne:布尔型的可选项,默认为false,删除符合条件的所有文档,如果设为 true,则只删除一个文档。
- writeConcem:可选项,设置抛出异常的级别。
下面举例说明删除集合中的文档,先进行数据插入操作,代码如下:
> db.myColl6.insertMany([ ... {"name":"test1", "age":10}, ... {"name":"test2", "age":20}, ... {"name":"test3", "age":20}, ... {"name":"test4", "age":40} ... ]) "acknowledged" : true, "insertedIds" : [ ObjectId("5f50477ee31448829d2dfbfe"), ObjectId("5f50477ee31448829d2dfbff"), ObjectId("5f50477ee31448829d2dfc00"), ObjectId("5f50477ee31448829d2dfc01") ] }
使用 find() 函数查询的代码如下:
> db.myColl6.find() { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 } { "_id" : ObjectId("5f50477ee31448829d2dfbff"), "name" : "test2", "age" : 20 } { "_id" : ObjectId("5f50477ee31448829d2dfc00"), "name" : "test3", "age" : 20 } { "_id" : ObjectId("5f50477ee31448829d2dfc01"), "name" : "test4", "age" : 40 }
接下来移除 age为20的文档,执行以下操作后,查询会发现两个文档记录均被删除
> db.myColl6.remove( ... {"age":20} // 删除age为20的文档 ... ) WriteResult({ "nRemoved" : 2 }) > > db.myColl6.find() // 重新查看, age为20的两条数据都被删除(justOne默认为false) { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 } { "_id" : ObjectId("5f50477ee31448829d2dfc01"), "name" : "test4", "age" : 40 }
另外,可以设置比较条件,如下操作为删除 age大于 10 的文档记录:
> db.myColl6.remove( ... {"age":{$gt:10}} // 删除age大于10的文档 ... ) WriteResult({ "nRemoved" : 1 }) > > db.myColl6.find() { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 }
如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
db.myColl6.remove( ... {"age":20}, // 删除age为20的文档, 如果有多条只删除第一条找到的文档 ... {"justOne":true} ... )
示例:
> db.myColl6.find() { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 } { "_id" : ObjectId("5f504a9fe31448829d2dfc02"), "name" : "test2", "age" : 20 } { "_id" : ObjectId("5f504a9fe31448829d2dfc03"), "name" : "test3", "age" : 30 } // age为30的第一条文档 { "_id" : ObjectId("5f504a9fe31448829d2dfc04"), "name" : "test4", "age" : 40 } { "_id" : ObjectId("5f504a9fe31448829d2dfc05"), "name" : "test5", "age" : 50 } { "_id" : ObjectId("5f504ac8e31448829d2dfc06"), "name" : "test6", "age" : 30 } // age为30的第二条文档 > > db.myColl6.remove( // 删除age为30的文档, 但是justOne为true, 如果有多条只删除找到的第一条 ... {"age":30}, ... {"justOne": true} ... ) WriteResult({ "nRemoved" : 1 }) > > db.myColl6.find() { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 } { "_id" : ObjectId("5f504a9fe31448829d2dfc02"), "name" : "test2", "age" : 20 } { "_id" : ObjectId("5f504a9fe31448829d2dfc04"), "name" : "test4", "age" : 40 } { "_id" : ObjectId("5f504a9fe31448829d2dfc05"), "name" : "test5", "age" : 50 } { "_id" : ObjectId("5f504ac8e31448829d2dfc06"), "name" : "test6", "age" : 30 } // age为30的第二条文档还存在, 第一条被删除了
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
> db.myColl4.find() // 查看集合myColl4的数据 { "_id" : ObjectId("5f503f61e31448829d2dfbfb"), "name" : "tom", "age" : 18 } { "_id" : ObjectId("5f503f61e31448829d2dfbfc"), "name" : "jerry", "age" : 17 } { "_id" : ObjectId("5f503f61e31448829d2dfbfd"), "name" : "juli", "age" : 25 } { "_id" : ObjectId("5f5042412abbe921daedf540"), "name" : "25", "age" : 25 } > > db.myColl4.remove({}) // 删除myColl4的全部数据 WriteResult({ "nRemoved" : 4 }) > > db.myColl4.find() // 再次找寻, 没有数据了 > > show collections // myColl4集合存在 myColl1 myColl2 myColl3 myColl4 myColl5 myColl6
delete() 方法
官方推荐使用 deleteOne() 和 deleteMany() 方法删除文档,语法格式如下:
db.collection.deleteMany ({}) db.collection.deleteMany ({ status : "A" }) db.collection.deleteOne ({ status : "D" })
第一条语句删除集合下所有的文档,第二条语句删除 status 等于 A 的全部文档,第三条语句删除 status 等于 D 的一个文档。
具体remove和delete的区别可以百度, 都不难理解....