zoukankan      html  css  js  c++  java
  • mongodb批量更新操作文档的数组键

    persons文档的数据如下:

    > db.persons.find()
    { "_id" : 2, "name" : 2 }
    { "_id" : 3, "name" : 3 }

    > db.persons.update({_id:4},{_id:4,name:4})
    WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
    > db.persons.find()
    { "_id" : 2, "name" : 2 }
    { "_id" : 3, "name" : 3 }

    做完update操作,依然看不到_id:4的记录,因为update方法需要一个true指示器,才会对查询不到的记录进行insert操作:

    > db.persons.update({_id:4},{_id:4,name:4},true)
    WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 4 })
    > db.persons.find()
    { "_id" : 2, "name" : 2 }
    { "_id" : 3, "name" : 3 }
    { "_id" : 4, "name" : 4 }

    现有需求,将persons文档中的name为"3"的改成"33"

    > db.persons.update({name:"3"},{$set:{name:"33"}},false,true)

    false含义:若查不到name:"33"的键值对,则不执行插入操作,true含义:表示是批量更新

    为persons增加age:"88"属性

    > db.persons.update({name:"4"},{$set:{age:"88"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4", "age" : "88" }

    将age加2

    > db.persons.update({name:"4"},{$inc:{age:2}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4", "age" : 90 }

    将age属性拿走:

    > db.persons.update({age:90},{$unset:{age:1}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }

    给persons文档增加一条记录,_id为5

    > db.persons.insert({_id:5,name:5,books:[]})
    WriteResult({ "nInserted" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "name" : 5, "books" : [ ] }

    给books数组增加一个元素:"js"和"extjs4.0"

    > db.persons.update({_id:5},{$push:{books:"js"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "name" : 5, "books" : [ "js" ] }

    > db.persons.update({_id:5},{$push:{books:"extjs4.0"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "name" : 5, "books" : [ "js", "extjs4.0" ] }

    创建一个新的classes数组:

    > db.persons.update({_id:5},{$push:{classes:"01class"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "name" : 5, "books" : [ "js", "extjs4.0" ], "classes" : [ "01class"
    ] }

    为calsses数组一次增加几个元素:

    > db.persons.update({_id:5},{$pushAll:{classes:["02class","03class","04class"]}}
    )
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "name" : 5, "books" : [ "js", "extjs4.0" ], "classes" : [ "01class"
    , "02class", "03class", "04class" ] }

    删除_id是5的记录,并创建一个新的_id是5的记录,使用$addToSet,此命令会检查要添加的元素在数组里面是不是存在,存在就不会再添加,否则会添加:

    > db.persons.remove({_id:5})
    WriteResult({ "nRemoved" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    > db.persons.insert({_id:5,books:["js"]})
    WriteResult({ "nInserted" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ "js" ] }
    > db.persons.update({_id:5},{$addToSet:{books:"js"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ "js" ] }
    > db.persons.update({_id:5},{$addToSet:{books:"java"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ "js", "java" ] }
    > db.persons.update({_id:5},{$addToSet:{books:"mongo"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ "js", "java", "mongo" ] }

    删除books数组的第一个元素:"js",使用$pop命令:

    > db.persons.update({_id:5},{$pop:{books:-1}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ "java", "mongo" ] }
    > db.persons.update({_id:5},{$pop:{books:1}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ "java" ] }

    -1代表第一个元素,1代表最后一个元素

    也可以使用pull命令一次删除一个指定的元素:

    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ "java", "mongo", "js" ] }
    > db.persons.update({_id:5},{$pull:{books:"js"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ "java", "mongo" ] }

    $pullAll命令可以一次指定多个要删除的元素:

    > db.persons.update({_id:5},{$pullAll:{books:["java","mongo"]}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ ] }

    创建一条新的记录_id为6:

    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ ] }
    { "_id" : 6, "books" : [ { "type" : "js", "name" : "extjs4.0" }, { "type" : "db"
    , "name" : "mongodb" }, { "type" : "js", "name" : "jquery" } ] }

    为type是js的books元素添加pens:"too long"属性,使用.符号一定使用双引号引用

    > db.persons.update({"books.type":"js"},{$set:{"books.$.author":"tom"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4, "name" : "4" }
    { "_id" : 5, "books" : [ ] }
    { "_id" : 6, "books" : [ { "type" : "js", "name" : "extjs4.0", "author" : "tom"
    }, { "type" : "db", "name" : "mongodb" }]
    }

    db.persons.update({"books.type":"js"},{$set:{"books.$.pens":"too long"}})

    判断数组元素执行插入操作,重复的元素不会被插入第二次:

    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4 }
    { "_id" : 5, "books" : [ "js" ] }

    > db.persons.update({_id:5},{$addToSet:{books:{$each:["js","db","java"]}}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.persons.find()
    { "_id" : 2, "name" : "33" }
    { "_id" : 3, "name" : "33" }
    { "_id" : 4 }
    { "_id" : 5, "books" : [ "js", "db", "java" ] }

  • 相关阅读:
    form表单的两种提交方式,submit和button的用法
    ORACLE SEQUENCE用法(转)
    hive优化
    Hive分区表创建、分类
    Hive体系结构
    Hive入门指南
    mysql统计表中条目个数的方法举例
    mysql如何快速创建相同结构的表
    VMware Workstation下VMnet1等虚拟网卡与主机网卡之间的关系
    linux命令详解——lsof
  • 原文地址:https://www.cnblogs.com/qkabcd/p/7478601.html
Copyright © 2011-2022 走看看