MongoDB教程以及SQL和MongoDB查询的映射
MongoDB教程
引言
欢迎来到 MongoDB 教程。这是 MongoDB 系列文章的第一部分。
以下是所有三部分的链接
在第一部分中,由于我们刚接触 MongoDB 和 No-SQL,我想先从 No-SQL 的定义开始。
No-SQL:No-SQL 是 Not Only SQL 的缩写。No-SQL 是一种非关系型数据库。No-SQL 数据库不遵循 RDMS 的规则,并且 No-SQL 数据库不使用 SQL 来查询数据。
No-SQL 数据库可分为四类
- 文档存储
- 图存储
- 列值存储
- 键值存储
MongoDB 属于文档存储数据库。
文档存储数据库:在文档存储数据库中,数据以文档的形式存储。它扩展了键值存储数据库的概念。
MongoDB 和 CouchDB 是两个主要的文档存储数据库。MongoDB 以文档形式存储数据。下面是一个示例文档。
在机器上设置 MongoDB
从下面的 MongoDB 官方网站下载 MongoDB(根据您的操作系统下载 MSI 文件)。
安装 MSI 文件(如果是 Windows 操作系统,默认位置是 (C:\Program Files\MongoDB))。
复制此文件夹并将其放在您的 C 驱动器或任何其他驱动器中,并在 C 驱动器中创建一个名为 data 的文件夹,然后在 data 文件夹内创建一个名为 db 的文件夹。
所以现在我们在 C 驱动器中有两个文件夹
- MongoDB(从安装位置复制)
- data/db(创建一个名为 data 的文件夹,然后在 data 文件夹内创建一个名为 db 的文件夹)
启动 MongoDB
转到我们放在 c 驱动器中的 MongoDB 文件夹内的 bin 文件夹。
在我的例子中,bin 文件夹在 MongoDB 文件夹内。(它也可能在 server 文件夹内,如下所示)
C:\Program Files\MongoDB\Server\3.0\bin
双击 Mongod.exe(它将打开一个命令提示符并启动 MongoDB 服务器)。
最后一行应显示“Waiting for connections...”,如下所示,这表示我们的 MongoDB 服务器已成功启动。
下载 RoboMongo
RoboMongo。面向 Shell 的跨平台开源 MongoDB 管理工具(即,管理 GUI)。[它] 嵌入了与 MongoDB 的 mongo shell 相同的 JavaScript 引擎(基于 Mozilla SpiderMonkey)。这意味着您可以在 Robomongo 中重用您现有的 MongoDB Shell 技能。
我们可以从 Robomongo 官方网站 Robomongo.org 下载 Robomongo。这是 URL
下载后,运行 EXE 文件,然后转到 文件-->连接(确保您的 mongodb 服务器正在运行,这是我们在上一步通过 Mongod.exe 启动的)。
MongoDB 术语
在继续之前,我们应该知道 MongoDB 的术语。
操作 (Operation) | 在 SQL 中 | 在 MongoDB 中 |
Create | Insert | Insert |
读取 | Select | 查找 |
更新 | 更新 | 更新 |
删除 | 删除 | 移除 |
表格 | 表格 | Collection |
行 | 行 | 文档 |
MongoDB 的关键点
- MongoDB 以 JSON 格式存储数据(我们称之为 BSON(二进制 JSON))
- JSON 是 JavaScript Object Notations 的缩写,看起来像 {“Name”:”Vijay”}
- JSON 文档以键值对的形式存储数据,例如 {“X”:1,”Y”:2,”Z”:3}
- JSON 中有两个基本结构
- 数组:事物列表用项目列表 [………] 表示
- 字典:关联映射 {key:Value}
例如 {Name : ‘Vijay’,City : ‘Shamli’,interest : ["Sports" ,"Music" ]}
Name 和 City 是字典,Interest 是一个数组。
- MongoDB 是无模式的,无模式意味着两个文档不必具有相同的模式。
集合中的第一个文档可以是:{Name:"Vijay",Email:"VijayRana1091@gmail.com"}
同一集合中的第二个文档可以是:{Name:"Vijay",Email:"VijayRana1091@gmail.com",Address : "Delhi"} - MongoDB 不支持 Join。
- MongoDB 不支持事务。
现在是查询时间
我们将在此处查看一些我们日常在 SQL Server 中运行的查询,以及 MongoDB 中的等效查询。
为此,我在 SQL Server 中创建了一个具有以下架构的表,并在 MongoDB 中创建了一个相同的集合(记住表在 MongoDB 中就是集合)。
我们将使用 MongoDB 在 MongoDB 中创建相同的表并对该表进行不同的操作。
操作 (Operation) | SQL | MongoDB |
选择数据库 | use Test | use Test |
我们将收到一条消息“switched to db Test”。
插入记录 | Insert into Student Values_
(1,'Vijay', 'VijayRana1091@gmail.com', _
'9711965544','Delhi')
| db.Student.insert(_
{"_id":1,"Name":"Vijay",_
"Email":"VijayRana1091@gmail.com",
"PhoneNo":"9711965544",_
"Address":"Delhi"}
)
|
注意:_id
在 MongoDB 中用作主键。如果我们不在此列中插入任何值,MongoDB 将自动插入一个唯一的 ID。
在 SQL Server 和 MongoDB 中插入更多记录(附带 SQL 脚本和 MongoDB 脚本)
运行脚本后,我们在 Student
表(SQL Server 和 MongoDB)数据库中拥有以下数据。
Select | 选择所有列
选择部分列
| 选择所有列
选择部分列
我们使用 |
Where 子句 | select * from student _
where Name='Vijay'
| db.Student.find({Name:"Vijay"})
|
大于和小于 |
|
我们使用 |
例如 | 下面的查询将在
假设我们要查找所有 Name 以字母 '
假设我们要获取所有 Name 以字母 '
| 在 MongoDB 中,我们使用
以下查询将获取所有 Name 以字母 '
以下查询将获取所有 Name 以字母 '
|
AND/OR | 并且: select * from Student_
where Name ='Vijay'_
and phoneNo='9711965544'
或者: select * from Student_
where Name ='Vijay'_
or phoneNo='9711997119'
| 并且: db.Student.find_
({$and :[{Name :'Vijay'},_
{PhoneNo : '9711965544'}]})
或者: db.Student.find_
({$or:[{Name :'Vijay'},_
{PhoneNo : '9711997119'}]})
|
in | select * from Student where id in(1,3,5)
| db.Student.find({_id:{$in:[1,3,5]}}) |
计数/排序 | 统计所有记录
按升序排序记录
按降序排序
| 统计所有记录
按升序排序记录
按降序排序
|
更新 | update student set phoneNo='2222222222',_
Address='USA' where ID=4
| db.Student.update({_id:4},_
{$set:{PhoneNo:'2222222222',_
Address:'USA'}})
Upsert(插入或更新) db.Student.update({_id:9},_
{$set:{PhoneNo:'2222222222',_
Address:'USA'}},{upsert:true})
上述查询将搜索 Multi(多条) 假设我们执行以下查询 db.Student.update({Name:"Vijay"},_
{$set:{PhoneNo:'2222222222',_
Address:'USA'}})
它将只更新一条记录(记住,只更新第一个匹配 Name 为“ db.Student.update({Name:"Vijay"},_
{$set:{PhoneNo:'2222222222',_
Address:'USA'}},_
{multi:true})
|
删除/移除/丢弃 | 带条件的删除
删除所有记录
Drop
| 带条件的删除
删除所有记录
Drop
|
顶部 |
| 限制
Skip
顾名思义, |
Distinct(去重) | select distinct Name from Student | db.Student.distinct("Name") |
备份 | BACKUP DATABASE Test
TO DISK = 'C:\Vijay\Test.Bak'
WITH FORMAT,
MEDIANAME = 'Z_SQLServerBackups',
NAME = 'Full Backup of Test Database';
| 转到命令提示符并运行以下命令(假设您的 C:\Program Files\MongoDB\Server\3.0\bin\mongodump --db Test |
MongoDB 函数
在 MongoDB 数据库中,我们可以像在 SQL Server 中一样创建函数。MongoDB 为我们提供了一个名为 System.js 的集合。
System.js 集合包含两个键
_id
:_id
是函数名。value
:value
包含实际的函数定义。
例如,假设我们要创建一个接受 firstname
和 lastname
两个参数并返回全名的函数。
db.system.js.save
(
{
_id: "FullName",
value : function(FirstName,LastName) { return FirstName + ' ' + LastName; }
}
)
为了调用此函数,我们需要先加载服务器脚本,然后才能像下面这样调用此函数。
db.loadServerScripts();
FullName('Vijay','Rana')
当我们调用此函数时,Vijay Rana 将是结果。
MongoDB 中的自动递增 ID(SQL Server 中的 Identity)
在 MongoDB 中,_id
用作主键。如果我们不在 _id
字段中插入任何值,MongoDB 将自动在此列中插入一个唯一的十六进制值。但是,如果我们希望在此字段中输入自动递增的整数值(如 SQL Server 中的 Identity 或 Oracle 中的 Sequence),则没有直接的方法可以做到。为此,我们需要遵循以下步骤。
步骤 1
创建一个集合(在本例中为 Identity),它将保存计数器。
db.createCollection("Identity") // Identity is my collection Name
第二步
在此集合中插入一个具有初始计数器值的文档。
db.Identity.insert({_id:"incrementID",sequence_value:0})
步骤 3
创建一个函数,该函数将递增此 sequence_value
并将该函数添加到 system.js 中,如下所示。
db.system.js.save
(
{
_id: "getNextIdentity",
value : function getNextIdentity(sequenceName)
{
var sequenceDocument = db.Identity.findAndModify
({
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
new:true
});
return sequenceDocument.sequence_value;
}
}
)
步骤 4
在插入文档时,我们可以调用此函数,它将返回一个递增的值,如下所示。
db.Employee.insert({
"_id":getNextIdentity("incrementID"),
"EmpName":"Vijay",
"Age":"30"
})
在下一篇文章中,我将讨论其余的 MongoDB 命令。我们将如何生成自动递增 ID,就像我们在 SQL Server(Identity 列)中所做的那样,并且我们将看到 .NET 与 MongoDB 的连接。
历史
- 2016 年 3 月 25 日:初始版本