MongoDB更新文档
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。但是这两个方法是有区别的。
update() 方法用于更新已存在的文档。
先插入测试数据:
db.persons.insert([{name:"zhangfei",age:123}])Code language: CSS (css)
更新文档:
db.persons.update({name:"zhangfei"},{$set:{age:123}})
db.persons.find().pretty()Code language: PHP (php)
前面的是查询条件,后面的是修改字段。
以上语句只会修改第一条发现的文档,如果要修改多条相同的文档,需要设置 multi 参数为 true:
db.persons.update({name:"zhangfei"},{$set:{age:123}},{multi:true})Code language: PHP (php)
db.persons.update({"name":"zhangsan"},{$set:{"name":"张小三"}},{multi:true})Code language: PHP (php)
save() 方法
save() 方法通过传入的文档来替换已有文档。以下实例中替换了 _id 为 5e6afcf12fd52051f44c6b29 的文档数据:
db.persons.find().pretty()
db.persons.save({
"_id" : ObjectId("5e6afcf12fd52051f44c6b29"),
"name" : "张三丰",
"age" : 150
})Code language: JavaScript (javascript)
如果 save() 找不到这条文档,就以新增的方式插入文档:
db.persons.save({
"_id": ObjectId("5e6b848a5c77097d8620d82d"),
"name": "张飞",
"age": 1234
})Code language: JavaScript (javascript)
补充说明
- update() 里必须用
$set操作符,否则会把整个文档替换成只有更新字段的内容 - save() 不管指定不指定其他字段,都会用传入的文档整体替换原文档
- 新版本 MongoDB 推荐使用 updateOne() 和 updateMany() 代替 update()
- updateOne() 只改第一条,updateMany() 改所有匹配文档
db.persons.updateOne({name:"zhangfei"},{$set:{age:123}})
db.persons.updateMany({name:"zhangfei"},{$set:{age:123}})Code language: PHP (php)
- 如果需要”找不到就新增”,加 upsert 参数:
db.persons.updateOne({name:"guanyu"},{$set:{age:200}},{upsert:true})Code language: PHP (php)

MongoDB删除文档
MongoDB remove()函数是用来移除集合中的数据。
语法
remove() 方法的基本语法格式如下所示:
db.collection.remove(
<query>,
<justOne>
)Code language: HTML, XML (xml)
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别。
示例
db.persons.find().pretty()
db.persons.remove({'_id':ObjectId("5e6afcf12fd52051f44c6b29")})
db.persons.find().pretty()Code language: JavaScript (javascript)
db.persons.remove({"name":"张小三"}, {justOne: true})
db.persons.remove({"_id": ObjectId("5e6b848a5c77097d8620d82d")}, {justOne: true})Code language: JavaScript (javascript)
补充说明
- remove() 不传条件会删除集合中全部文档,操作前务必确认:
db.persons.remove({})Code language: CSS (css)
- 新版本 MongoDB 推荐使用 deleteOne() 和 deleteMany() 代替 remove()
- deleteOne() 只删第一条匹配文档,deleteMany() 删除所有匹配文档
db.persons.deleteOne({"name":"张小三"})
db.persons.deleteMany({"name":"张小三"})Code language: JavaScript (javascript)
- 删除整个集合用 drop(),比逐条删除效率高:
db.persons.drop()Code language: CSS (css)
MongoDB查询文档
MongoDB 查询文档使用 find() 方法。
find() 方法以非结构化的方式来显示所有文档。
语法
MongoDB 查询数据的语法格式如下:
db.collection.find(query, projection)Code language: CSS (css)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值,只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.col.find().pretty()Code language: CSS (css)
pretty() 方法以格式化的方式来显示所有文档。
MongoDB 与 RDBMS Where 语句比较
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
| 操作 | 格式 | 范例 | RDBMS中的类似语句 |
|---|---|---|---|
| 等于 | {key:value} | db.col.find({“by”:”菜鸟教程”}).pretty() | where by = ‘菜鸟教程’ |
| 小于 | {key:{$lt:value}} | db.col.find({“likes”:{$lt:50}}).pretty() | where likes < 50 |
| 小于或等于 | {key:{$lte:value}} | db.col.find({“likes”:{$lte:50}}).pretty() | where likes <= 50 |
| 大于 | {key:{$gt:value}} | db.col.find({“likes”:{$gt:50}}).pretty() | where likes > 50 |
| 大于或等于 | {key:{$gte:value}} | db.col.find({“likes”:{$gte:50}}).pretty() | where likes >= 50 |
| 不等于 | {key:{$ne:value}} | db.col.find({“likes”:{$ne:50}}).pretty() | where likes != 50 |
MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。语法格式如下:
db.col.find({key1:value1, key2:value2}).pretty()
db.persons.find({'name':'张三','age':12}).pretty()Code language: JavaScript (javascript)
MongoDB OR 条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
db.persons.find(
{
$or: [
{'name':'张三'},
{'age':12}
]
}
).pretty()Code language: PHP (php)
AND 和 OR 联合使用
db.col.find({
"likes": {$gt:50},
$or: [
{"by": "菜鸟教程"},
{"title": "MongoDB 教程"}
]
}).pretty()Code language: PHP (php)
示例
db.persons.find().pretty()
db.persons.find({age:{$gte: 56}}).pretty()
db.persons.find({age:56,name:'zhouxingci'})
db.persons.find({$or: [{age:56},{name:'张三'}]})
db.persons.find({age:123,$or: [{age:56},{name:'张三'}]})
db.persons.insert({age:123,name:'张三'})Code language: PHP (php)
补充说明
- find() 查询条件不写时返回集合中全部文档
- pretty() 只是格式化输出,不影响查询结果
- AND 条件直接在 find() 里写多个键值对即可,逗号表示 AND
- OR 条件必须用 $or 包裹,值是一个数组,数组里每个元素是一个条件对象
- AND 和 OR 可以嵌套使用,AND 在外层,$or 作为其中一个条件键
- 新版本还支持 findOne() 只返回第一条匹配文档
Previous: 第三方管理工具:NoSQLBooster for MongoDB
Next: MongoDB条件查询