MongoDB从入门到实战(五):MongoDB 修改文档 update

x33g5p2x  于2021-12-25 转载在 Go  
字(8.8k)|赞(0)|评价(0)|浏览(615)

db.collection.update(query, update)

整体替换。

  1. > db.user.find()
  2. { "_id" : 1, "username" : "a" }
  3. { "_id" : 2, "username" : "b" }
  4. // update默认是整体替换掉满足条件的文档而不是单独的修改指定字段的值
  5. > db.user.update({"_id": 1}, {"age": 30})
  6. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  7. > db.user.find()
  8. { "_id" : 1, "age" : 30 }
  9. { "_id" : 2, "username" : "b" }
  10. // update(query, update) : 默认修改满足条件的第一条文档
  11. > db.user.find()
  12. { "_id" : 1, "username" : "a" }
  13. { "_id" : 2, "username" : "a" }
  14. > db.user.update({"username": "a"}, {"username": "aa"})
  15. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  16. > db.user.find()
  17. { "_id" : 1, "username" : "aa" }
  18. { "_id" : 2, "username" : "a" }

db.collection.update(query, update, insertOrUpdate)

  1. // 不存在则添加
  2. > db.user.find()
  3. > db.user.update({"_id": 1}, {"username": "addOrUpdate"}, true)
  4. WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 1 })
  5. > db.user.find()
  6. { "_id" : 1, "username" : "addOrUpdate" }
  7. // 存在则更新
  8. > db.user.update({"_id": 1}, {"username": "Update"}, true)
  9. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  10. > db.user.find()
  11. { "_id" : 1, "username" : "Update" }

修饰器

$set

局部修改,修改指定字段的值。

  1. // 使用 $set修改器 修改指定字段, 当字段不存在时会创建并赋值
  2. > db.user.find()
  3. { "_id" : 1, "username" : "a" }
  4. { "_id" : 2, "username" : "b" }
  5. // 字段存在则修改,不存在则添加字段
  6. > db.user.update({"_id": 1}, {"$set": {"username": "aa", "age": 30}})
  7. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  8. > db.user.find()
  9. { "_id" : 1, "username" : "aa", "age" : 30 }
  10. { "_id" : 2, "username" : "b" }

db.collection.update(query, update, insertOrUpdate, multiUpdate)

批量更新只适用于局部替换,不能使用全局覆盖。

  1. > db.user.find()
  2. { "_id" : 1, "username" : "a" }
  3. { "_id" : 2, "username" : "a" }
  4. // 批量 局部更新
  5. > db.user.update({"username": "a"}, {"$set": {"username": "aaa"}}, false, true)
  6. WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
  7. > db.user.find()
  8. { "_id" : 1, "username" : "aaa" }
  9. { "_id" : 2, "username" : "aaa" }

$unset

用于删除字段。

  1. // 删除age字段
  2. > db.user.update({"_id": 1}, {"$unset": {"age": 1}})
  3. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  4. > db.user.find()
  5. { "_id" : 1, "username" : "aa" }
  6. { "_id" : 2, "username" : "b" }

$inc

用于递增或者递减某个值,值为整数表示递增,值为负数表示递减。

  1. > db.user.find()
  2. { "_id" : 1, "age" : 29 }
  3. { "_id" : 2, "age" : 30 }
  4. > db.user.update({_id: 1}, {"$inc": {"age": 2}})
  5. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  6. > db.user.find()
  7. { "_id" : 1, "age" : 31 }
  8. { "_id" : 2, "age" : 30 }
  9. > db.user.update({_id: 1}, {"$inc": {"age": -2}})
  10. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  11. > db.user.find()
  12. { "_id" : 1, "age" : 29 }
  13. { "_id" : 2, "age" : 30 }

$push

向数组字段的尾部添加一个元素,如果字段不存在则创建。

  1. > db.user.find()
  2. { "_id" : 1, "username" : "aa" }
  3. { "_id" : 2, "username" : "b" }
  4. // 文档不存在hobby字段就添加,类型为数组
  5. > db.user.update({"_id": 1}, {"$push": {"hobby": "money"}})
  6. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  7. > db.user.find()
  8. { "_id" : 1, "username" : "aa", "hobby" : [ "money" ] }
  9. { "_id" : 2, "username" : "b" }
  10. // 文档hobby存在字段,就向数组尾部添加元素
  11. > db.user.update({"_id": 1}, {"$push": {"hobby": "xiaojiejie"}})
  12. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  13. > db.user.find()
  14. { "_id" : 1, "username" : "aa", "hobby" : [ "money", "xiaojiejie" ] }
  15. { "_id" : 2, "username" : "b" }

$push + $each

向数组字段的尾部一次性添加多个元素。

  1. > db.user.find()
  2. { "_id" : 1, "username" : "a" }
  3. { "_id" : 2, "username" : "b" }
  4. // 一次性向数组字段的尾部添加多个元素
  5. > db.user.update({"_id": 1}, {"$push": {"hobby": {"$each": ["money", "xiaojiejie"]}}})
  6. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  7. > db.user.find()
  8. { "_id" : 1, "username" : "a", "hobby" : [ "money", "xiaojiejie" ] }
  9. { "_id" : 2, "username" : "b" }

$addToSet

想数组尾部添加一个不存在的元素,如果存在则不添加。

  1. > db.user.find()
  2. { "_id" : 1, "username" : "a" }
  3. { "_id" : 2, "username" : "b" }
  4. // 第一次添加成功
  5. > db.user.update({"_id": 1}, {"$addToSet": {"hobby": "money"}})
  6. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  7. > db.user.find()
  8. { "_id" : 1, "username" : "a", "hobby" : [ "money" ] }
  9. { "_id" : 2, "username" : "b" }
  10. // 第二次添加失败
  11. > db.user.update({"_id": 1}, {"$addToSet": {"hobby": "money"}})
  12. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
  13. > db.user.find()
  14. { "_id" : 1, "username" : "a", "hobby" : [ "money" ] }
  15. { "_id" : 2, "username" : "b" }

$pop

弹出数组的头部元素或尾部元素: -1:头部,1:尾部。

  1. > db.user.find()
  2. { "_id" : 1, "username" : "a", "hobby" : [ "money", "xiaojiejie", "dog" ] }
  3. { "_id" : 2, "username" : "b" }
  4. > db.user.update({"_id": 1}, {"$pop": {"hobby": 1}})
  5. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  6. > db.user.find()
  7. { "_id" : 1, "username" : "a", "hobby" : [ "money", "xiaojiejie" ] }
  8. { "_id" : 2, "username" : "b" }
  9. >

$pull

删除数组中的指定的值。

  1. > db.user.find()
  2. { "_id" : 1, "username" : "a", "hobby" : [ "money", "xiaojiejie", "dog" ] }
  3. { "_id" : 2, "username" : "b" }
  4. // 删除指定的元素
  5. > db.user.update({"_id": 1}, {"$pull": {"hobby": "xiaojiejie"}})
  6. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  7. > db.user.find()
  8. { "_id" : 1, "username" : "a", "hobby" : [ "money", "dog" ] }
  9. { "_id" : 2, "username" : "b" }

使用下标修改数组中指定的元素

  1. > db.user.insert({ "_id" : 1, "addresses" : [ { "city" : "shanghai", "area" : "pudong" }, { "city" : "beijing", "area" : "chaoyang" } ] })
  2. // 修改addresses字段中的第二个元素中的area字段的值
  3. > db.user.update({"_id": 1}, {"$set": {"addresses.1.area": "dongcheng"}})
  4. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  5. > db.user.find()
  6. { "_id" : 1,
  7. "addresses" : [
  8. { "city" : "shanghai", "area" : "pudong" },
  9. { "city" : "beijing", "area" : "dongcheng" }
  10. ]
  11. }
  1. // $ 表示满足条件所对应的下标
  2. > db.user.update({"addresses.city": "shanghai"}, {"$set": {"addresses.$.area": "Pu Dong"}})
  3. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  4. > db.user.find().pretty()
  5. {
  6. "_id" : 1,
  7. "addresses" : [
  8. {
  9. "city" : "shanghai",
  10. "area" : "Pu Dong"
  11. },
  12. {
  13. "city" : "beijing",
  14. "area" : "dongcheng"
  15. }
  16. ]
  17. }

db.collection.findAndModify({ “query”: xxx, “update”: xxx)

findAndModify : 查找满足添加的值并返回,并且修改满足条件的第一条文档。

  1. > db.user.find()
  2. { "_id" : 1, "username" : "a" }
  3. { "_id" : 2, "username" : "a" }
  4. > db.user.findAndModify({"query": {"username": "a"}, "update": {"username": "aa"}})
  5. { "_id" : 1, "username" : "a" }
  6. > db.user.find()
  7. { "_id" : 1, "username" : "aa" }
  8. { "_id" : 2, "username" : "a" }

相关文章