MongoDB入门实战教程:增删改查

搭建起了一个MongoDB的小集群环境,我们就来学习一下MongoDB的基本操作。

1 insert 操作

我们都知道对于传统关系型数据库,通常会使用 SQL 来进行基本操作。而对于MongoDB来说,通常则会使用 MQL 来进行基本操作。

首先,我们来看看如何插入新数据,MongoDB为我们提供了插入单个和多个文档的接口。

插入单个文档:db.<collectionName>.insertOne

db.teams.insertOne({name:"cscec-football-team", members:22});

插入多个文档:db.<collectionName>.insertMany

db.teams.insertMany([
{name:"yzw-football-team", members:22},
{name:"yzw-basktellball-team", members:15},
{name:"yzw-outting-team", members:30}
]);

2 find 操作

查询操作(find)初步

在关系型数据库中,我们最常用的操作就是 select,对于MongoDB则是 find。需要注意的是,find 返回的是游标。

查询所有数据:db.<collectionName>.find


db.teams.find(); -- 未格式化
db.teams.find().pretty(); -- 格式化

如果你使用的是 navicat,可以切换一下展现形式看看。

查询带条件的数据:db.<collectionName>.find(filter)


-- 单个条件
db.teams.find({"members":22});
-- 多个条件的 and(类似于 SQL 中的 and)
db.teams.find({"members":22, "name":"yzw-football-team"});
-- 上面也等价于
db.teams.find({$and:[{"members":22, "name":"yzw-football-team"}]});
-- 多个条件的 or(类似于 SQL 中的 or)
db.teams.find({$or:[{"members":22, "name":"yzw-football-team"}]});
-- 按照正则表达式查找
db.teams.find({"name":/^ball/});

查询操作(find)进阶搜索

在 MQL 中,传统 SQL 中的查询条件如>, <, !=等操作符有了不一样的表述:


-- 找到人数>20 的 team
db.teams.find({"members":{$gt:20}});
-- 找到人数<20 的 team
db.teams.find({"members":{$lt:20}});
-- 找到人数>=20 的 team
db.teams.find({"members":{$gte:20}});
-- 找到人数<=20 的 team
db.teams.find({"members":{$lte:20}});
-- 找到人数!=20 的 team
db.teams.find({"members":{$ne:20}});

下面是查询条件的一个对照表:

MongoDB 入门实战教程:增删改查
如果需要查询某个字段是 NULL?又或者如何实现 SQL 中的 IN 呢?


-- name IS NULL
db.teams.find({"name":{$exists:false}});
-- name IS NOT NULL
db.teams.find({"name":{$exists:true}});
-- members IN(11,22,30)
db.teams.find({"members":{$in:[11,22,30]}});
-- members NOT IN(11,22,30)
db.teams.find({"members":{$nin:[11,22,30]}});

下面是查询逻辑的一个对照表:

MongoDB 入门实战教程:增删改查
查询操作(find)子文档搜索

在 MQL 中,可以支持我们使用”字段.子字段名”的形式来查询子文档:

-- 填充数据
db.products.insertOne({name:"YZ.JC", description:{country:"China", province:"Chengdu"}});
-- 查询子文档
db.products.find({"description.country":"China"});

查询操作(find)数组搜索

在 MQL 中,可以支持我们搜索数组中的元素:


-- 填充数据
db.products.insertMany([
  {name:"Walkman", color:["white","gray"]},
  {name:"CD Player", color:["black","yellow"]}
  ]);
-- 查询 color 为 white 的
db.products.find({color:"white"});
-- 查询 color 为 white 或者 black 的
db.products.find({$or:[{color:"white"},{color:"black"}]});

在 MQL 中,也可以支持我们搜索数组中的对象:


-- 填充数据
db.games.insertOne({
  "title":"Winning Eleven 2021",
  "versions":[
    {"language":"English", "code":"US", "market":"NorthAmerica"},
    {"language":"Chinese", "code":"CN", "market":"China"},
    {"language":"Japanese", "code":"JP", "market":"Japan"}
  ]
});
-- 搜索子对象的 market 是 Japan 的
db.games.find({"versions.market":"Japan"});
-- 搜索子对象的 market 是 China 且 code 是 CN 的
db.games.find({"versions.market":"China","versions.code":"CN"});
-- 使用 elemMatch:必须同一个子对象满足多个条件
db.games.find({"versions":{$elemMatch:{"market":"China","code":"CN"}}});

查询操作(find)控制返回字段

在 MQL 中,find 操作可以指定只返回指定的字段,即所谓的投影操作(projection),需要注意的是:_id 字段必须明确指明不返回,否则默认会返回。操作实例如下:


-- 指明不返回 _id,且只返回 name 字段
db.teams.find({"members":{$gte:10}},{"_id":0, name:1});
-- 不指明是否返回 _id 则默认返回,且只返回 name 字段
db.teams.find({"members":{$gte:10}},{name:1});
-- 它其实等价于
db.teams.find({"members":{$gte:10}},{"_id":1, name:1});

3 update 操作

在 MQL 中,update 操作的格式为:db.<collectionName>.update

假设这里要实现更新 yzw-football-team 的 members 为 22 人:

db.teams.updateOne({name:"yzw-football-team"},{"$set":{members:29}});

需要注意的是:使用 updateOne 无论条件匹配多少个记录,它都只会更新第一条。有点类似于.NET 中的 FirstOrDefault()方法。

同时,MQL 还提供了 updateMany 方法以支持同时更新多个满足条件的文档,例如这里将所有人数为 22 人的 team 的名字都改为 yzw-football-team:

db.teams.updateMany({members:22},{"$set":{name:"yzw-football-team"}});

除此之外,还可以使用 update 来更新数组:

使用$push 即可增加一个对象到数组底部:


db.games.update({title:"Winning Eleven 2021"},
  {"$push": 
  { 
     versions:{"language": "Korean","code": "KO", "market": "South Korea"} 
  }});

此外,还可以使用$pushAll 即可增加多个对象到数组底部,使用$pop 来从数组底部删除一个对象,使用$addToSet 来实现如果不存在则新增一个值到数组等等。这里,就不再展示示例了。

4 remove 操作

在 MQL 中,删除文档的命令格式为:db.<collectionName>.remove,一般情况下它需要配合查询条件来使用,否则它会删除所有文档(慎用)。

remove 操作示例:


db.teams.remove({name:"yzw-football-team"}); // 删除 name 为 yzw-football-team 的文档
db.teams.remove({members:{"$lt":22}}); // 删除 members 小于 22 人的文档
db.teams.remove({}); // 删除所有文档,慎用

5 drop 操作

在 MQL 中,删除集合的命令格式为:db.<CollectionName>.drop()。

使用此命令,集合中的全部文档都会被删除,集合相关的索引也会被删除。

例如,我们将 teams 这个集合删除:

db.teams.drop(); // 慎用

那么,如何删除某个数据库呢?可以使用 db.dropDatabase() 来删除数据库,需要注意的是 数据库响应文件也会被删除,磁盘空间会得到释放。

use studentsDB
db.dropDatabase(); // 慎用

总结
本文总结了MongoDB的基本操作,包括了 insert、find、remove、update 和 drop。学会这些基本操作,我们就可以应对大部分的常见使用场景了。

 


来源:Edison Zhou https://mp.weixin.qq.com/s/pB79V0LiEyqLZsvaSr-4Ew

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...