Mongo Shell 删除操作
-
练习用数据:
db.inventory.insertMany( [ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" }, { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" }, { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" }, { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" }, { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }, ] );
-
删除文档时需要给删除方法传入filter,如果删除全部文档,则 filter = {} ;
删除操作的行为
- 索引: 即使删除操作删除了整个集合的文档,删除操作也不会删除集合的索引;
- 原子性:同更新操作一样,删除操作本质也是mongo的写操作,是单个文档级别的原子操作;
- 写确认:对于写入操作,可以指定写操作的确认级别;
删除方法
-
db.collection.deleteOne() : 最多删除一条符合匹配条件的文档;
db.collection.deleteOne( <filter>, { writeConcern: <document>, collation: <document>, hint: <document|string> // Available starting in MongoDB 4.4 } )
使用唯一索引一部分的字段(例如_id)进行精确删除
-
db.collection.deleteMany() : 删除所有符合筛选条件的文档;
db.collection.deleteMany( <filter>, { writeConcern: <document>, collation: <document> } )
-
db.collection.remove() :删除一条或是所有符合筛选条件的文档
有两种语法模式:
db.collection.remove( <query>, <justOne> )
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document>, collation: <document> } )
justOne = true 时仅删除一条符合筛选要求的文档;justOne = false ,默认值也是false,会删除所有符合条件的文档;
db.products.remove( { qty: { $gt: 20 } }, true )
删除第一条符合 qty > 20 的文档
-
db.collection.findOneAndDelete() : 支持删除查询文档后按照指定顺序排序后的第一个文档
db.collection.findOneAndDelete( <filter>, { writeConcern: <document>, projection: <document>, sort: <document>, maxTimeMS: <number>, collation: <document> } )
测试数据:
db.scores.insertMany( [ { _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 }, { _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 }, { _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 }, { _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 }, { _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 }, { _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 } ] )
删除按照 points 升序排序后第一个满足 “name” = “A. MacDyver” 的文档
db.scores.findOneAndDelete( { "name" : "A. MacDyver" }, { sort : { "points" : 1 } } )
-
db.collection.findAndModify() : 参数sort允许对查询文档排序,remove允许对文档进行删除操作,并返回删除结果。
db.collection.findAndModify({ query: <document>, sort: <document>, remove: <boolean>, update: <document or aggregation pipeline>, // Changed in MongoDB 4.2 new: <boolean>, fields: <document>, upsert: <boolean>, bypassDocumentValidation: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], let: <document> // Added in MongoDB 5.0 });
示例:
从people 集合删除state = "active"且rating字段值最小的文档
db.people.findAndModify( { query: { state: "active" }, sort: { rating: 1 }, remove: true } ) >>> { "_id" : ObjectId("52fba867ab5fdca1299674ad"), "name" : "XYZ123", "score" : 1, "state" : "active", "rating" : 3 }
-
db.collection.bulkWrite() : operations是一个写操作列表,可以在里面调用deleteOne()或者deleteMany()方法。
db.collection.bulkWrite( [ <operation 1>, <operation 2>, ... ], { writeConcern : <document>, ordered : <boolean> } )