• 学习mongo系列(十二)修改器($inc/$set/$unset/$push/$pop/upsert)


    对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能够高效的进行文档更新。更新修改器是中特殊的键,
    用来指定复杂的操作,比如增加、删除或者调整键,还可能是操作数组或者内嵌文档。
    1.$inc

    > db.b.insert({"uid":"201603","type":"1","size":10})
    WriteResult({ "nInserted" : 1 })
    > db.b.find()
    { "_id" : ObjectId("56f3554d7a84d5a96555d7e5"), "uid" : "201603", "type" : "1",
    "size" : 10 }
    > db.b.update({"uid":"201603"},{"$inc":{"size":5}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.b.find()
    { "_id" : ObjectId("56f3554d7a84d5a96555d7e5"), "uid" : "201603", "type" : "1",
    "size" : 15 }
    > db.b.update({"uid":"201603"},{"$inc":{"size":2}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.b.find()
    { "_id" : ObjectId("56f3554d7a84d5a96555d7e5"), "uid" : "201603", "type" : "1",
    "size" : 17 }
    > db.b.update({"uid":"201603"},{"$inc":{"size":-7}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.b.find()
    { "_id" : ObjectId("56f3554d7a84d5a96555d7e5"), "uid" : "201603", "type" : "1",
    "size" : 10 }

    得出结论:修改器$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
    (这里有个问题:上篇中说到更新默认只对满足条件的记录集中第一个文档进行更新,那么使用$inc修改器之后,还是一样吗?)

    2.$set

      ①--结合上边的例子,没有sname的情况:

    > db.b.update({"uid":"201603"},{"$set":{"sname":"ssk"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.b.find()
    { "_id" : ObjectId("56f3554d7a84d5a96555d7e5"), "uid" : "201603", "type" : "1",
    "size" : 10, "sname" : "ssk" }

    ②--有sname的情况:

    > db.b.update({"uid":"201603"},{"$set":{"sname":"mongo"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.b.find()
    { "_id" : ObjectId("56f3554d7a84d5a96555d7e5"), "uid" : "201603", "type" : "1",
    "size" : 10, "sname" : "mongo" }

    ③--修改键的值的类型:

    > db.b.update({"uid":"201603"},{"$set":{"sname":["mongo","redies","mysql"]}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.b.find()
    { "_id" : ObjectId("56f3554d7a84d5a96555d7e5"), "uid" : "201603", "type" : "1",
    "size" : 10, "sname" : [ "mongo", "redies", "mysql" ] }
    >

      ④--对于内嵌

       首先通过$set将sname键修改为内嵌形式

    > db.b.update({"uid":"201603"},{"$set":{"sname":{"height":10,"width":20,"length"
    :30}}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.b.find({"uid":"201603"}).pretty()
    {
    "_id" : ObjectId("56f3554d7a84d5a96555d7e5"),
    "uid" : "201603",
    "type" : "1",
    "size" : 10,

    "sname" : {
      "height" : 10,
      "width" : 20,
      "length" : 30
    }

    }
    > db.b.update({"uid":"201603"},{"$set":{"sname.height":5,"sname.width":15}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.b.find({"uid":"201603"}).pretty()
    {
    "_id" : ObjectId("56f3554d7a84d5a96555d7e5"),
    "uid" : "201603",
    "type" : "1",
    "size" : 10,
    "sname" : {
    "height" : 5,
    "width" : 15,
    "length" : 30
    }
    }
    >

  • 相关阅读:
    关于LoginFilter的问题
    MyEclipse:各种提示图标的含义
    Js获取当前日期时间及其它操作
    微信jsApI及微信分享对应在手机浏览器的调用总结。
    js 刷新页面window.location.reload();
    applicationContext.xml
    网页打开微信的链接
    myeclipse竖行删除
    实现算法2.15、2.16的程序(一个数组只生成一个静态链表)
    循环链表
  • 原文地址:https://www.cnblogs.com/mxh1099/p/5314800.html
Copyright © 2020-2023  润新知