MongoDB入门实战教程(4)
通过前面几篇的铺垫,我们基本了解了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}});
下面是查询条件的一个对照表:

如果需要查询某个字段是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]}});
下面是查询逻辑的一个对照表:

查询操作(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(); // 慎用
6 总结
本文总结了MongoDB的基本操作,包括了insert、find、remove、update和drop。学会这些基本操作,我们就可以应对大部分的常见使用场景了。
下一篇,我们会学习如何通过.NET应用程序访问和操作MongoDB。
参考资料
唐建法,《MongoDB高手课》(极客时间)
郭远威,《MongoDB实战指南》(图书)

△推荐订阅学习

MongoDB入门实战教程(4)的更多相关文章
- Kafka入门实战教程(7):Kafka Streams
1 关于流处理 流处理平台(Streaming Systems)是处理无限数据集(Unbounded Dataset)的数据处理引擎,而流处理是与批处理(Batch Processing)相对应的.所 ...
- ZooKeeper入门实战教程(一)-介绍与核心概念
1.ZooKeeper介绍与核心概念1.1 简介ZooKeeper最为主要的使用场景,是作为分布式系统的分布式协同服务.在学习zookeeper之前,先要对分布式系统的概念有所了解,否则你将完全不知道 ...
- Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门
前言 本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的Node+Express+MongoDB+Socket.io搭建实时聊天应用实 ...
- Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建
前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...
- MongoDB入门必读(概念与实战并重)
MongoDB入门必读(概念与实战并重) 一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个 ...
- mybatis实战教程(mybatis in action),mybatis入门到精通
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...
- mybatis实战教程(mybatis in action),mybatis入门到精通(转)
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...
- mongodb入门教程二
title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...
- mongodb入门教程
title: mongodb入门教程 date: 2016-04-06 14:47:18 tags: --- 为什么要认识呢,因为这玩意就一傻逼 借用一下百科的介绍 MongoDB 是一个介于关系数据 ...
- MongoDb 入门教程
MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据. 常 ...
随机推荐
- Linux系统中的目录和文件夹的区别
Linux系统中的目录和文件夹的区别 目录 Linux系统中的目录和文件夹的区别 一.概念与术语背景 1.目录(Directory) 2.文件夹(Folder) 二.技术实现差异 1.存储内容 2.权 ...
- 2024 蓝桥杯模拟赛3(div1+div2)
2024 蓝桥杯模拟赛3(div1+div2) P8834 [传智杯 #3 决赛] 序列 简单的模拟,数据范围很小,暴力即可 点击查看代码 #include <bits/stdc++.h> ...
- GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试
前言 当前GStreamer是开源的多媒体框架,其适配后可以支持板卡的硬编码.硬解码,还提供RTSP服务器等功能,降低了音视频开发的门槛(转移到gstreamer配置和开发上了,但是跨平台),瑞芯 ...
- (原创)[开源][.Net Framework 4.5] SimpleMVVM(极简MVVM框架)更新 v1.1,增加NuGet包
一.前言 意料之外,也情理之中的,在主业是传统行业的本人,技术的选型还是落后于时代. 这不,因现实需要,得将大库中的 WPF MVVM 相关部分功能拆分出来独立使用,想着来都来了,就直接开源得了,顺便 ...
- [设计模式/Java] 设计模式之门面模式(外观模式)【20】
概述 : 门面模式 := 外观模式 := Facade Pattern 产生背景 软件开发过程中,我们经常会遇到复杂系统,其中包含多个子系统和接口.在这种情况下,为了简化客户端的调用过程,提高代码的可 ...
- .NET Core中的配置Configuration实战
在前面的一篇文章中,我们对.NET 中的配置Configuration进行了一个详细的介绍,并且从整个源码的解读解释了配置中的核心接口以及主要的实现类.文章链接为:https://cshellowor ...
- Windows上,10分钟构建一个本地知识库
这篇文章是我约新书<RAG应用实战>的一个样章,基于阿里云代码构建的一个本地RAG服务. 本地模型看代码注释,需要替换几行代码. 阅读本章时,已默认安装你的个人电脑上安装了Python 3 ...
- 1.4K star!几分钟搞定AI视频创作,这个开源神器让故事可视化如此简单!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 story-flicks 是一个基于AI技术的自动化视频生成工具,能够将文字剧本快速转化为高 ...
- 首发 最新AWVS/Acunetix Premium V24.8高级版漏洞扫描器(最新版)Windows/Linux下载
前言 Acunetix Premium 是一种 Web 应用程序安全解决方案,用于管理多个网站.Web 应用程序和 API 的安全.集成功能允许您自动化 DevOps 和问题管理基础架构. Acune ...
- 轮播图导航组件 | 纯血鸿蒙组件库AUI
摘要: 轮播图导航(A_SwiperNav):实现沉浸式体验的App全屏轮播引导页效果.可设置图片数据(含文本.图片地址.路由.标题.子标题),可设置按钮颜色. 一.在页面当中调用轮播图导航组件 打开 ...