Mongo Shell 删除操作

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>
       }
    )
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值