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 日:初始版本




