本章介绍了MongoDB的常用操作,具体包括如下:
插入文档删除文档更新文档查找文档db.collection.update(query, update, options):修改已经存在的文档,还可以修改指定的字段或者替换整个文档。
语法
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, arrayFilters: [<filterdocument1>, ...] } ) 参数类型说明querydocument查询条件updatedocument or pipeline如果是文档则替换;如果是$set修改器更新字段upsertboolean可选。如果为true,匹配则更新,否则插入文档。默认值false。multiboolean可选。如果为true,更新匹配多个文档。如果为false,更新一条文档。默认值false。arrayFiltersarray可选。数组筛选,根据筛选条件,筛选出要更新的数组元素。文档替换:文档替换是最简单的更新,用新文档去替换旧的文档,比较适合于大规模数据迁移。
db.user.remove() db.user.insertMany([ {"_id": 1, "user_name": "tom", "age": 20}, {"_id": 2, "user_name": "Abc", "age": 21} ]) -- 这里把_id为1的文档替换成_id为3的文档 db.user.update({"_id": 1}, {"_id": 3, "user_name": "hello", "age": 22})部分字段更新:使用更新修改器来更新部分字段,而不是替换文档。
db.user.remove({}) db.user.insertMany([ {"_id": 1, "user_name": "tom", "age": 20}, {"_id": 2, "user_name": "Abc", "age": 21} ]) -- 使用$set修改字段时,不存在则创建;存在就更新 db.user.update({"_id"}, {"$set": {"user_name": "ABC"}})更多修改器使用方法参考:MongoDB官网
数组修改:修改文档的数组字段时,需要使用$push修改器。如果数组不存在,则会创建数组;如果数组存在,则向数组追加元素。
db.books.remove({}) db.books.insertMany([ {"_id": 1, "name": "Java编程思想", tag: ["java"]}, {"_id": 2, "name": "代码重构"} ]) db.books.update({}, {$push: {"tag": "经典"}}, {multi: true}) {"_id": 1, "name": "Java编程思想", tag: ["java", "经典"]}, {"_id": 2, "name": "代码重构", tag: ["经典"]}删除字段:移除字段
db.books.update({}, {$unset: {"tag": 1 }}, {multi: true}) {"_id": 1, "name": "Java编程思想"}, {"_id": 2, "name": "代码重构"}数组过滤器:我们可以为数组指定一个标识符,然后根据标识符去更新数组中的符合条件的元素。
一个数组标识符只能标识一个数组。
-- 筛选出数组x下的x.a>85 or x.b > 80的文档 arrayFilters: [ {"or": [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }] -- 这是不合法的,同一个数组有两个标识符 arrayFilters: [ {"x.a": {$gt: 85}}, {"x.b": {$gt: 80}} ] -- 这是合法的,两个不同的数组有不同数组标识符 arrayFilters: [ {"x.a": {$gt: 85}}, {"y.b": {$gt: 80}} ] db.students2.insertMany([ { "_id" : 1, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 6 }, { "grade" : 85, "mean" : 90, "std" : 4 }, { "grade" : 85, "mean" : 85, "std" : 6 } ] } { "_id" : 2, "grades" : [ { "grade" : 90, "mean" : 75, "std" : 6 }, { "grade" : 87, "mean" : 90, "std" : 3 }, { "grade" : 85, "mean" : 85, "std" : 4 } ] } ]) db.students2.update( { }, { $set: { "grades.$[elem].mean" : 100 } }, { multi: true, arrayFilters: [ { "elem.grade": { $gte: 85 } } ] } )upsert:匹配则更新,否则插入一条文档。创建新文档的字段来自query和update里。
db.books.update(<query>, <update>, {upsert: true}) -- 没有这条记录时 db.books.update( {item: "ABC123"}, {$set: {"name": "java", "tags": [1,2,3]}}, {upsert: true} ) { "_id": ObjectId("5da79019835b2f1c75348a0a"), "item": "ABC123", "name": "java", "tags": [1,2,3] }关于upsert的操作,官网讲得很详细。传送门