MongoDB文档

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() 只返回第一条匹配文档

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注