Mongo DB 【CRUD】

155 阅读1分钟

插入

  • InsertOne(), 原子的,插入一个document
  • InsertMany(), 非原子的,插入document数组

InsertOne( {字段1:值,字段2:值} )

> db.crew.insertOne({name: "tony", skills: ["coding"], address:{city:"Beijing", country: "China"} })
{
        "acknowledged" : true,
        //id是12字节,4字节时间戳,5字节随即值,3字节计数器
        "insertedId" : ObjectId("619720ead7079d0dd875a74e")
}

InsertMany( [ {字段1:值,字段2:值}, {字段1:值,字段2:值} ] )

  • 虽然返回的id可能是连续的,也可能不是连续的,因为这个操作不是一个事务,可能会被其他request中断。

查询

  • findOne()
  • find()
  • Mongo DB有一个wiredtiger的算法,它认为写入总是有效的。所以,如果执行查询的下一秒,有新的写入
  • 传统关系数据库: 是查询前获得一个view,后续写入不会反应在查询结果上
  • Mongo DB: 查询将停止,除非管理readConcerned。它会执行写入,会在写入完成或失败时,重试查询

更新

  • updateMany() updateMany(1,2,3)
  1. {查询条件}
  2. {$set: {字段:新值,字段:新值}, $currentDate:{lastModified:true}},lastModified字段必须为当前日期,如果字段不存在,则创建lastModified
  3. {upsert:true},这个为options对象。upsert为真,表示如果没找到匹配项,则创建document
> db.crew.updateMany({skills: "management"}, {$set: {"address.city":"Shanghai", "address.country": "China"}, $currentDate: {lastModified:true}},{upsert:true})
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }

> db.crew.find({skills: "management"}).pretty()
{
        "_id" : ObjectId("619380fe204711818273f99c"),
        "name" : "Andrei Luca",
        "skills" : [
                "technical",
                "management"
        ],
        "address" : {
                "city" : "Shanghai",
                "country" : "China"
        },
        "lastModified" : ISODate("2021-11-19T06:24:17.729Z")
}
{
        "_id" : ObjectId("619380fe204711818273f99d"),
        "name" : "Anna Smith",
        "skills" : [
                "technical",
                "management"
        ],
        "address" : {
                "city" : "Shanghai",
                "country" : "China"
        },
        "lastModified" : ISODate("2021-11-19T06:24:17.729Z")
}

除了UpdateMany()之外,还有

  • UpdateOne()
  • ReplaceOne()

删除

  • deleteMany({查询条件})
> db.crew.deleteMany({skills: "coding"})
{ "acknowledged" : true, "deletedCount" : 2 }