第三章 MongoDB的增删改查(2)

第三章 MongoDB的增删改查(2)

本章介绍了MongoDB的常用操作,具体包括如下:

  • 插入文档
  • 删除文档
  • 更新文档
  • 查找文档

1.更新

db.collection.update(query, update, options):修改已经存在的文档,还可以修改指定的字段或者替换整个文档。

语法

db.collection.update(
	<query>,
	<update>,
	{
		upsert: <boolean>,
		multi: <boolean>,
		arrayFilters: [<filterdocument1>, ...]
	}
)
参数 类型 说明
query document 查询条件
update document or pipeline 如果是文档则替换;如果是$set修改器更新字段
upsert boolean 可选。
如果为true,匹配则更新,否则插入文档。
默认值false。
multi boolean 可选。
如果为true,更新匹配多个文档。
如果为false,更新一条文档。
默认值false。
arrayFilters array 可选。数组筛选,根据筛选条件,筛选出要更新的数组元素。
Example

文档替换:文档替换是最简单的更新,用新文档去替换旧的文档,比较适合于大规模数据迁移。

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的操作,官网讲得很详细。传送门

你可能感兴趣的:(MongoDB)