65.9K
CodeProject 正在变化。 阅读更多。
Home

MongoDB教程以及SQL和MongoDB查询的映射

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (58投票s)

2016 年 3 月 25 日

CPOL

8分钟阅读

viewsIcon

313634

downloadIcon

229

MongoDB教程

引言

欢迎来到 MongoDB 教程。这是 MongoDB 系列文章的第一部分。

以下是所有三部分的链接

  1. MongoDB教程以及SQL和MongoDB查询的映射
  2. MongoDB 教程 - 第二天
  3. MongoDB 教程 - 第 3 天(性能 - 索引)

在第一部分中,由于我们刚接触 MongoDB 和 No-SQL,我想先从 No-SQL 的定义开始。

No-SQL:No-SQL 是 Not Only SQL 的缩写。No-SQL 是一种非关系型数据库。No-SQL 数据库不遵循 RDMS 的规则,并且 No-SQL 数据库不使用 SQL 来查询数据。

No-SQL 数据库可分为四类

  1. 文档存储
  2. 图存储
  3. 列值存储
  4. 键值存储

MongoDB 属于文档存储数据库。

文档存储数据库:在文档存储数据库中,数据以文档的形式存储。它扩展了键值存储数据库的概念。

MongoDB 和 CouchDB 是两个主要的文档存储数据库。MongoDB 以文档形式存储数据。下面是一个示例文档。

在机器上设置 MongoDB

从下面的 MongoDB 官方网站下载 MongoDB(根据您的操作系统下载 MSI 文件)。

安装 MSI 文件(如果是 Windows 操作系统,默认位置是 (C:\Program Files\MongoDB))。

复制此文件夹并将其放在您的 C 驱动器或任何其他驱动器中,并在 C 驱动器中创建一个名为 data 的文件夹,然后在 data 文件夹内创建一个名为 db 的文件夹。

所以现在我们在 C 驱动器中有两个文件夹

  1. MongoDB(从安装位置复制)
  2. 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 的关键点

  1. MongoDB 以 JSON 格式存储数据(我们称之为 BSON(二进制 JSON))
  2. JSON 是 JavaScript Object Notations 的缩写,看起来像 {“Name”:”Vijay”}
  3. JSON 文档以键值对的形式存储数据,例如 {“X”:1,”Y”:2,”Z”:3}
  4. JSON 中有两个基本结构
    1. 数组:事物列表用项目列表 [………] 表示
    2. 字典:关联映射 {key:Value}

      例如 {Name : ‘Vijay’,City : ‘Shamli’,interest : ["Sports" ,"Music" ]}
      Name 和 City 是字典,Interest 是一个数组。

  5. MongoDB 是无模式的,无模式意味着两个文档不必具有相同的模式。
    集合中的第一个文档可以是:{Name:"Vijay",Email:"VijayRana1091@gmail.com"}
    同一集合中的第二个文档可以是:{Name:"Vijay",Email:"VijayRana1091@gmail.com",Address : "Delhi"}
  6. MongoDB 不支持 Join。
  7. 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

选择所有列

select * from student

选择部分列

select ID,Name from Student

选择所有列

db.Student.find()

选择部分列

db.Student.find({},{"Name":true})

我们使用 find() 方法从表中提取所有记录。

Where 子句
select * from student _
where Name='Vijay'
db.Student.find({Name:"Vijay"})

大于和小于

select * from student where ID>2

select * from student where ID>=2

select * from student where ID<2

select * from student where ID<=2

db.Student.find({_id:{$gt:2}})

db.Student.find({_id:{$gte:2}})

db.Student.find({_id:{$lt:2}})

db.Student.find({_id:{$lte:2}})

我们使用 $gt/$gte 表示大于/大于等于,使用 $lt/$lte 表示小于/小于等于。

例如

下面的查询将在 Name 列中的任何位置查找字母 P 的所有记录。

select * from student where Name like '%P%'

假设我们要查找所有 Name 以字母 'a' 结尾的记录。

select * from student where Name like '%a'

假设我们要获取所有 Name 以字母 'P' 开头的记录。

select * from student where Name like 'p%'

在 MongoDB 中,我们使用 $regex 操作符来检查字母 'P' 是否存在于 Name 列中的任何位置。

db.Student.find({Name:{$regex:"P"}})

以下查询将获取所有 Name 以字母 'a' 结尾的记录。

db.Student.find({Name:{$regex:"a$"}})

以下查询将获取所有 Name 以字母 'P' 开头的记录。

db.Student.find({Name:{$regex:"^P"}})

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]}})

计数/排序

统计所有记录

select count(*) from Student

按升序排序记录

select * from student order by Name

按降序排序

select * from student order by Name desc

统计所有记录

db.Student.find().count()

按升序排序记录

db.Student.find().sort({Name:1})

按降序排序

db.Student.find().sort({Name:-1})

更新
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})

上述查询将搜索 _id9 的文档。如果存在 _id9 的文档,它将更新 phoneNoAddress,否则将插入一个 _id9 的新文档。

Multi(多条)

假设我们执行以下查询

db.Student.update({Name:"Vijay"},_
		{$set:{PhoneNo:'2222222222',_
         Address:'USA'}})

它将只更新一条记录(记住,只更新第一个匹配 Name 为“Vijay”的记录)。但是,如果我们想更新所有 Name 为“Vijay”的记录,我们将传递 multi 参数。

db.Student.update({Name:"Vijay"},_
	{$set:{PhoneNo:'2222222222',_
    Address:'USA'}},_
	{multi:true})

删除/移除/丢弃

带条件的删除

Delete from student where ID=5

删除所有记录

Delete from Student

Drop

drop table Student

带条件的删除

db.Student.remove({_id:5})

删除所有记录

db.Student.remove({})

Drop

db.Student.drop()

顶部

select Top 2* from Student

限制

db.Student.find().limit(2)

Skip

db.Student.find().skip(2).limit(2)

顾名思义,skip 将跳过文档数量,limit 将限制记录数量。

 
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';

转到命令提示符并运行以下命令(假设您的 mongodump exe 在 bin 文件夹内,如果位置不同,请相应更改)。

C:\Program Files\MongoDB\Server\3.0\bin\mongodump --db Test

 

MongoDB 函数

在 MongoDB 数据库中,我们可以像在 SQL Server 中一样创建函数。MongoDB 为我们提供了一个名为 System.js 的集合。

System.js 集合包含两个键

  1. _id_id 是函数名。
  2. valuevalue 包含实际的函数定义。

例如,假设我们要创建一个接受 firstnamelastname 两个参数并返回全名的函数。

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 日:初始版本
© . All rights reserved.