MongoDB更新
2019獨角獸企業重金招聘Python工程師標準>>>
更新的兩種方法
1替換更新:會覆蓋原數據
2操作符更新:不會覆蓋原數據? 性能更好 原子性操作
?
update() 方法用于更新已存在的文檔。語法格式如下:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )參數說明:
query : update的查詢條件,類似sql update查詢內where后面的;
update : update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set后面的
upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。
multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。
writeConcern :可選,寫安全配置。
?
更新選擇器
新增數據拿不到ObjectID?
使用insert增加數據返回值是什么?
????var insert = ?db.users.insert({"username":"ruolan"})
使用upsert屬性,讓update變成insert
????db.users.update({"":""},{"username":"leilei"},{"upsert":true})
建議: ? ?
????不要用objectID作為系統中檢索數據的條件 ? ?
????update中的query加在有索引的字段
?
更新示例
刪除字段示例
db.users.updateMany({"username":"lison"},{"$unset":{"country":"","age":""}})
更新字段名稱示例
db.users.updateMany({"username":"jack"},{"$rename":{"country":"guojia","age":"nianling"}})
$each作用示例? 無each會被當成一個整體插入
db.users.updateMany({ "username" : "jack"}, { "$addToSet" : { "favorites.movies" : { "$each" : [ "小電影2 " , "小電影3"]}}})
db.users.updateMany({ "username" : "jack"}, { "$addToSet" : { "favorites.movies" : [ "小電影2 " , "小電影3"]}})
刪除字符串數組中元素示例
db.users.updateMany({ "username" : "jack"}, { "$pull" : { "favorites.movies" : [ "小電影2 " , "小電影3"]}})
db.users.updateMany({ "username" : "jack"}, { "$pullAll" : { "favorites.movies" : [ "小電影2 " , "小電影3"]}})
?
向對象數組中插入元素
給jack老師增加一條評論($push)
db.users.updateOne({"username":"jack"},{"$push":{"comments":{"author":"lison23","content":"ydddyyytttt"}}})
給jack老師批量新增兩條評論($push,$each)
db.users.updateOne({"username":"jack"}, ? ? ? ? ? ?{"$push":{"comments": ? ? ? ? ? ? ? ? ? {"$each":[{"author":"lison22","content":"yyyytttt"}, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {"author":"lison23","content":"ydddyyytttt"}?]?}}})?給jack老師批量新增兩條評論并對數組進行排序($push,$eachm,$sort)
db.users.updateOne({"username":"jack"}, ?{"$push": {"comments":{"$each":[ {"author":"lison22","content":"yyyytttt"},{"author":"lison23","content":"ydddyyytttt"} ],$sort: {"author":1}} } })?
刪除對象數組中元素示
刪除lison1對jack的所有評論 (批量刪除)
db.users.update({"username":"jack"}, {"$pull":{"comments":{"author":"lison22"}}})
刪除lison5對lison評語為“lison是蒼老師的小迷弟”的評論
db.users.update({"username":"lison"}, {"$pull":{"comments":{"author":"lison5", "content":"lison是蒼老師的小迷弟"}}})
更新對象數組中元素,$符號示例
db.users.updateMany({"username":"jack","comments.author":"lison1"},{"$set":{"comments.$.content":"xxoo","comments.$.author":"lison10"}}) 含義:精確修改某人某一條精確的評論,如果有多個符合條件的數據,則修改最后一條數據。無法批量修改數組元素?
更新的原子性
1.mongodb的更新都是原子的,mongodb所有的寫操作都是有鎖的。mongoDB 2.2之前鎖級別為實例級別,mongoDB 2.2以后版本鎖級別為數據庫級別,mongoDB 3.0中,WiredTiger的鎖級別是文檔級別;
2.findAndModify命令:在同一往返過程中原子更新文檔并返回它;
示例
常規的update的方法不能返回更新后的數據
使用findandModify方法在修改數據同時返回更新前的數據或更新后的數據
db.num.findAndModify({"query":{"_id":ObjectId("5a58cef99506c50abaeb4384")},"update":{"$inc":{"saleOrder":1}},"new" : true})3.$isolated命令:mongoDB對寫鎖進行了優化,對長時間的寫操作會為其他的讀寫操作讓路,使用$isolated可以避免這種讓路,隔離其他操作,不允許其他操作交叉更新,不能再分片中使用;
例如:db.users.update({"$isolated”:true},{"username":"lison"},{"$pull":{"comments":{"author":"lison5","content":"lison是蒼老師的小迷弟"}}})?
原生Document代碼
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class JavaUpdateObjArray {private static final Logger logger = LoggerFactory.getLogger(JavaUpdateObjArray.class);private MongoDatabase db;private MongoCollection<Document> collection;@Resourceprivate MongoClient client;@Beforepublic void init(){db = client.getDatabase("lison");collection=db.getCollection("users");}//--------------------------------------insert demo--------------------------------------------------------------//給jack老師增加一條評論($push)//db.users.updateOne({"username":"jack"}, // {"$push":{"comments":{"author":"lison23","content":"ydddyyytttt"}}})@Testpublic void addOneComment(){Document comment = new Document().append("author", "lison23").append("content", "ydddyyytttt");Bson filter = eq("username","jack");Bson update = push("comments",comment);UpdateResult updateOne = collection.updateOne(filter, update);System.out.println(updateOne.getModifiedCount());}// 給jack老師批量新增兩條評論($push,$each) // db.users.updateOne({"username":"jack"}, // {"$push":{"comments": // {"$each":[{"author":"lison33","content":"lison33lison33"}, // {"author":"lison44","content":"lison44lison44"}]}}})@Testpublic void addManyComment(){Document comment1 = new Document().append("author", "lison33").append("content", "lison33lison33");Document comment2 = new Document().append("author", "lison44").append("content", "lison44lison44");Bson filter = eq("username","jack");Bson pushEach = pushEach("comments",Arrays.asList(comment1,comment2));UpdateResult updateOne = collection.updateOne(filter, pushEach);System.out.println(updateOne.getModifiedCount());}// 給jack老師批量新增兩條評論并對數組進行排序($push,$eachm,$sort) // db.users.updateOne({"username":"jack"}, // {"$push": {"comments": // {"$each":[ {"author":"lison22","content":"yyyytttt"}, // {"author":"lison23","content":"ydddyyytttt"} ], // $sort: {"author":1} } } })@Testpublic void addManySortComment(){Document comment1 = new Document().append("author", "lison00").append("content", "lison00lison00");Document comment2 = new Document().append("author", "lison01").append("content", "lison01lison01");Bson filter = eq("username","jack");Document sortDoc = new Document().append("author", 1);PushOptions pushOption = new PushOptions().sortDocument(sortDoc);Bson pushEach = pushEach("comments",Arrays.asList(comment1,comment2),pushOption);UpdateResult updateOne = collection.updateOne(filter, pushEach);System.out.println(updateOne.getModifiedCount());}//--------------------------------------delete demo--------------------------------------------------------------// 刪除lison1對jack的所有評論 (批量刪除) // db.users.update({"username":“jack"}, // {"$pull":{"comments":{"author":"lison23"}}})@Testpublic void deleteByAuthorComment(){Document comment = new Document().append("author", "lison23");Bson filter = eq("username","jack");Bson update = pull("comments",comment);UpdateResult updateOne = collection.updateOne(filter, update);System.out.println(updateOne.getModifiedCount());}// 刪除lison5對lison評語為“lison是蒼老師的小迷弟”的評論(精確刪除) // db.users.update({"username":"lison"}, // {"$pull":{"comments":{"author":"lison5", // "content":"lison是蒼老師的小迷弟"}}})@Testpublic void deleteByAuthorContentComment(){Document comment = new Document().append("author", "lison5").append("content", "lison是蒼老師的小迷弟");Bson filter = eq("username","lison");Bson update = pull("comments",comment);UpdateResult updateOne = collection.updateOne(filter, update);System.out.println(updateOne.getModifiedCount());}//--------------------------------------update demo-------------------------------------------------------------- // db.users.updateMany({"username":"jack","comments.author":"lison1"}, // {"$set":{"comments.$.content":"xxoo", // "comments.$.author":"lison10" }}) // 含義:精確修改某人某一條精確的評論,如果有多個符合條件的數據,則修改最后一條數據。無法批量修改數組元素@Testpublic void updateOneComment(){Bson filter = and(eq("username","jack"),eq("comments.author","lison01"));Bson updateContent = set("comments.$.content","xxoo");Bson updateAuthor = set("comments.$.author","lison10");Bson update = combine(updateContent,updateAuthor);UpdateResult updateOne = collection.updateOne(filter, update);System.out.println(updateOne.getModifiedCount());}//--------------------------------------findandModify demo-------------------------------------------------------------- // 使用findandModify方法在修改數據同時返回更新前的數據或更新后的數據 // db.num.findAndModify({ // "query":{"_id":ObjectId("5a58cef99506c50abaeb4384")}, // "update":{"$inc":{"saleOrder":1}}, // "new":true // })@Testpublic void findAndModifyTest(){Bson filter = eq("_id",new ObjectId("5a5a3a87d7598152855d758e"));Bson update = inc("saleOrder",1); // //實例化findAndModify的配置選項FindOneAndUpdateOptions fauo = new FindOneAndUpdateOptions(); // //配置"new":truefauo.returnDocument(ReturnDocument.AFTER);//MongoCollection<Document> numCollection = db.getCollection("myOrder");Document ret = numCollection.findOneAndUpdate(filter, update,fauo);System.out.println(ret.toJson());} }Spring實現代碼
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SpringUpdateObjArray {private static final Logger logger = LoggerFactory.getLogger(SpringUpdateObjArray.class);@Resourceprivate MongoOperations tempelate;//--------------------------------------insert demo--------------------------------------------------------------//給jack老師增加一條評論($push)//db.users.updateOne({"username":"jack"}, // {"$push":{"comments":{"author":"lison23","content":"ydddyyytttt"}}})@Testpublic void addOneComment(){Query query = query(Criteria.where("username").is("jack"));Comment comment = new Comment();comment.setAuthor("lison23");comment.setContent("ydddyyytttt");Update push = new Update().push("comments", comment);WriteResult updateFirst = tempelate.updateFirst(query, push, User.class);System.out.println(updateFirst.getN());}// 給jack老師批量新增兩條評論($push,$each) // db.users.updateOne({"username":"jack"}, // {"$push":{"comments": // {"$each":[{"author":"lison33","content":"lison33lison33"}, // {"author":"lison44","content":"lison44lison44"}]}}})@Testpublic void addManyComment(){Query query = query(Criteria.where("username").is("jack"));Comment comment1 = new Comment();comment1.setAuthor("lison55");comment1.setContent("lison55lison55");Comment comment2 = new Comment();comment2.setAuthor("lison66");comment2.setContent("lison66lison66");Update push = new Update().pushAll("comments", new Comment[]{comment1,comment2});WriteResult updateFirst = tempelate.updateFirst(query, push, User.class);System.out.println(updateFirst.getN()); }// 給jack老師批量新增兩條評論并對數組進行排序($push,$eachm,$sort) // db.users.updateOne({"username":"jack"}, // {"$push": {"comments": // {"$each":[ {"author":"lison22","content":"yyyytttt"}, // {"author":"lison23","content":"ydddyyytttt"} ], // $sort: {"author":1} } } })@Testpublic void addManySortComment(){Query query = query(Criteria.where("username").is("jack"));Comment comment1 = new Comment();comment1.setAuthor("lison77");comment1.setContent("lison55lison55");Comment comment2 = new Comment();comment2.setAuthor("lison88");comment2.setContent("lison66lison66");Update update = new Update();PushOperatorBuilder pob = update.push("comments");pob.each(comment1,comment2);pob.sort(new Sort(new Sort.Order(Direction.DESC, "author")));System.out.println("---------------");WriteResult updateFirst = tempelate.updateFirst(query, update,User.class);System.out.println(updateFirst.getN()); }//--------------------------------------delete demo--------------------------------------------------------------// 刪除lison1對jack的所有評論 (批量刪除) // db.users.update({"username":“jack"}, // {"$pull":{"comments":{"author":"lison23"}}})@Testpublic void deleteByAuthorComment(){Query query = query(Criteria.where("username").is("jack"));Comment comment1 = new Comment();comment1.setAuthor("lison55");Update pull = new Update().pull("comments",comment1);WriteResult updateFirst = tempelate.updateFirst(query, pull, User.class);System.out.println(updateFirst.getN()); }// 刪除lison5對lison評語為“lison是蒼老師的小迷弟”的評論(精確刪除) // db.users.update({"username":"lison"}, // {"$pull":{"comments":{"author":"lison5", // "content":"lison是蒼老師的小迷弟"}}})@Testpublic void deleteByAuthorContentComment(){Query query = query(Criteria.where("username").is("lison"));Comment comment1 = new Comment();comment1.setAuthor("lison5");comment1.setContent("lison是蒼老師的小迷弟");Update pull = new Update().pull("comments",comment1);WriteResult updateFirst = tempelate.updateFirst(query, pull, User.class);System.out.println(updateFirst.getN()); }//--------------------------------------update demo-------------------------------------------------------------- // db.users.updateMany({"username":"jack","comments.author":"lison1"}, // {"$set":{"comments.$.content":"xxoo", // "comments.$.author":"lison10" }}) // 含義:精確修改某人某一條精確的評論,如果有多個符合條件的數據,則修改最后一條數據。無法批量修改數組元素@Testpublic void updateOneComment(){Query query = query(where("username").is("lison").and("comments.author").is("lison4"));Update update = update("comments.$.content","xxoo").set("comments.$.author","lison11");WriteResult updateFirst = tempelate.updateFirst(query, update, User.class);System.out.println(updateFirst.getN()); }//--------------------------------------findandModify demo-------------------------------------------------------------- //使用findandModify方法在修改數據同時返回更新前的數據或更新后的數據 //db.num.findAndModify({ // "query":{"_id":ObjectId("5a58cef99506c50abaeb4384")}, // "update":{"$inc":{"saleOrder":1}}, // "new":true // })@Testpublic void findAndModifyTest(){Query query = query(where("_id").is(new ObjectId("5a5a3a87d7598152855d758e")));Update update = new Update().inc("saleOrder", 1);FindAndModifyOptions famo = FindAndModifyOptions.options().returnNew(true);MyOrder ret = tempelate.findAndModify(query, update,famo, MyOrder.class);System.out.println(ret.getSaleOrder());}}?
轉載于:https://my.oschina.net/u/3728166/blog/2231562
總結
- 上一篇: CentOS 7设置KVM硬盘模式为SC
- 下一篇: Linux下切换用户出现su: Auth