简介
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。
特点
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
- 面向集合存储,易存储对象类型的数据。
- 模式自由。
- 支持动态查询。
- 支持完全索引,包含内部对象。
- 支持查询。
- 支持复制和故障恢复。
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 自动处理碎片,以支持云计算层次的扩展性。
- 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- 文件存储格式为BSON(一种JSON的扩展)。
- 可通过网络访问。
在C#中使用官方驱动操作MongoDB
先用官方提供的CSharpDriver-1.7.0.4714.zip
MongoDB.Driver.dll:顾名思义,驱动程序
MongoDB.Bson.dll:序列化、Json相关
然后在我们的程序中引用这两个dll。
下载安装和开启服务器
下载地址:http://www.mongodb.org/downloads。提供了各种平台的版本。我这里选择的是Windows平台下的。
新建目录E:\ mongodb , 将下载的压缩包解压到此目录。bin文件夹下有一堆.exe 文件
其中有两个最重要的文件:Mongod.exe和Mongo.exe 。
Mongod.exe 是用来连接到mongo数据库服务器的,即服务器端。
**Mongo.exe **是用来启动MongoDB shell的,即客户端。
其他文件:
mongodump 逻辑备份工具。
mongorestore 逻辑恢复工具。
mongoexport 数据导出工具。
mongoimport 数据导入工具。
开启服务器
第一步:新建一个目录用来存放MongoDB的数据库文件,即dbpath。随便建在那都可以,我这里建在 E:\MongoDBFiles。 这是为了下一步使用的。
第二步:打开CMD窗口,键入如下命令
e:
cd E:\mongodb\mongodb-win32-x86_64-3.0.6\bin
mongod.exe -dbpath "E:\mongodbfiles"
最后一行命令中的-dbpath 参数值就是我们第一步新建的文件夹。这个文件夹一定要在开启服务之前事先建立好,否则会报错,mongodb不会自己创建。
如果操作成功会出现如下界面:
该界面该我们展示了一些信息:如进程ID是7620,端口号是27017。
打开浏览器输入:http://127.0.0.1:27017/
我们看到了这样的提示:
“You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number”
到此,MongoDB数据库服务已经成功启动了。
使用mongo.exe 执行数据库增删改查操作
mongodb 为我们提供的客户端管理工具是mongo.exe
-
创建数据库:
双击打开mongo.exe 出现如下界面:
该界面的意思是,当前连接的数据库是test,这是系统默认将要创建的。为什么说是“将要创建的”呢?因为此时并不存在此数据库,或者说它现在还只在内存中,并没有创建在物理磁盘上。不信,你看MongoDBFiles文件夹下面除了mongod.lock外,什么都没有。只有当你执行了插入数据的命令后,该数据库才会真正的创建。
好了,我们暂时不管这个test了。现在我们来创建一个叫RdfDb的数据库。
在shell 命令窗口键入如下命令:
use RdfDb // use 命令用来切换当前数据库,如果该数据库不存在,则会先新建一个。
-
创建collection并插入数据
在传统关系型数据库中,创建完了库后接下来会创建表,但是在mongoDB中没有“表”的概念,与其对应的一个概念是集合,即collection。
在shell 命令窗口键入如下命令:
> db.users.insert({'name':'Bobby','sex':'man'})
// 这条命令是向users 集合中插入一条数据。
如果集合users不存在,则会先新建一个,然后再插入数据,参数以JSON格式传入。
因为我们后面要测试删除数据,所以我们再插入一条数据:
> db.users.insert({'name':'Samba','sex':'man'})
在上面我们创建了数据库,创建了集合,还插入了两条数据,那么这些操作有没有执行成功呢?我们来查询一下:
在shell 命令窗口键入如下命令:
> show dbs // 显示所有数据库
> show collections // 显示当前数据库下的所有集合
> db.users.find() // 显示users集合下的所有数据文档
shell 界面如下:
看我用红色标记的部分。这说明我们之前的操作是成功的。我们还看到系统**给每条记录分配了一个惟一主键 _id **。
-
更新数据
现在我们要把第二条数据的sex改成女即“women”
在shell 命令窗口键入如下命令:
> db.users.update({'name':'Samba'},{'$set':{'sex':'women'}},upsert=true,multi=false)
解释一下几个参数:
第一:查询的条件
第二:更新的字段
第三:如果不存在则插入
第四:是否允许修改多条记录
-
删除记录
我们现在要把第一条记录即'name'为'Bobby'的删除
在shell 命令窗口键入如下命令:
> db.users.remove({'name':'Bobby'})
我们在检验一下两步有没有操作成功,在shell 命令窗口键入如下命令:
> db.users.find()
从输出的界面我们看到现在只剩下一条'name'为'Samba'的了,并且它的'sex'为'women',这说明两步操作成功了。
- 删除collection
> db.users.drop() //如果删除成功会返回“true”,否则返回“false”
- 删除当前数据库
> db.dropDatabase()
Tdf.MongoDB
https://www.nuget.org/packages/Tdf.MongoDB/
基于MongoDB官方发布的C#驱动,封装对MongoDB数据库的增删改查访问方法;
Features
The full list of extension methods in Tdf.MongoDB right now are:
将集合名称写到C#代码中作为字符串常量 CollectionNames.cs
public class CollectionNames
{
public const string User = "User";
public const string Role = "Role";
}
编写实体类 User.cs
public class User : EntityBase
{
public string UserName { get; set; }
public int Age { get; set; }
public State State { get; set; }
}
其中,State枚举类定义如下: State.cs
public enum State
{
/// <summary>
/// 正常
/// </summary>
Normal = 1,
/// <summary>
/// 未使用
/// </summary>
Unused = 2,
}
在配置文件中编写数据库连接串和数据库名称 App.config
<appSettings>
<!--MongoDB数据库连接串-->
<add key="MongoDBConn" value="mongodb://127.0.0.1:27017"/>
<!--MongoDB数据库名称-->
<add key="MongoDBName" value="RdfDb"/>
</appSettings>
Get methods
static void QueryTest()
{
var queryBuilder = new QueryBuilder<User>();
var query = queryBuilder.GTE(x => x.Age, 27);
var ltModel = MongoDbHelper.GetManyByCondition<User>(DbConfigParams.ConntionString, DbConfigParams.DbName,
CollectionNames.User, query);
if (ltModel != null && ltModel.Count > 0)
{
foreach (var item in ltModel)
{
Console.WriteLine("姓名:{0},年龄:{1},状态:{2}",
item.UserName, item.Age, GetStateDesc(item.State));
}
}
}
/// <summary>
/// 获取状态描述
/// </summary>
/// <param name="state">状态</param>
/// <returns>状态描述</returns>
static string GetStateDesc(State state)
{
string result = string.Empty;
switch (state)
{
case State.Normal:
result = "正常";
break;
case State.Unused:
result = "未使用";
break;
default:
throw new ArgumentOutOfRangeException("state");
}
return result;
}
Insert methods
static void InsertTest()
{
var random = new Random();
for (var i = 1; i <= 10; i++)
{
var item = new User()
{
UserName = "我的名字" + i,
Age = random.Next(25, 30),
State = i % 2 == 0 ? State.Normal : State.Unused
};
MongoDbHelper.Insert(DbConfigParams.ConntionString, DbConfigParams.DbName, CollectionNames.User, item);
}
}
Update methods
static void UpdateTest()
{
var queryBuilder = new QueryBuilder<User>();
var query = queryBuilder.GTE(x => x.Age, 27);
var dictUpdate = new Dictionary<string, BsonValue>();
dictUpdate["State"] = State.Unused;
MongoDbHelper.Update(DbConfigParams.ConntionString, DbConfigParams.DbName, CollectionNames.User, query,
dictUpdate);
}
Delete methods
static void DeleteTest()
{
var queryBuilder = new QueryBuilder<User>();
var query = queryBuilder.GTE(x => x.Age, 28);
MongoDbHelper.DeleteByCondition(DbConfigParams.ConntionString, DbConfigParams.DbName, CollectionNames.User, query);
}
给Mongodb设置密码
mongod --dbpath 存放数据库文件夹路径
打开命令行窗口输入mongo,进入mongo环境
切换到 'admin' 数据库 use admin
给admin设置用户密码:
user: 用户名, pwd: 用户密码,roles: 用来设置用户的权限,比如读,读写 等等
db.createUser({user: 'root', pwd: '123456', roles: ['root']})
验证是否添加成功,'db.auth(用户名,用户密码)' 这里用db.auth('root', '123456') 如果返回 '1'表示验证成功, 如果是 '0' 表示验证失败...
切换到RdfLogDb数据库,use RdfLogDb
接下来为这个库添加一个用户,并且赋予权限,
db.createUser({user:'rdf',pwd:'rdfcore',roles: [{role:'readWrite',db:'RdfLogDb'}]})})
OK,一切搞定,重新开机mongodb,MongoDB默认是没有开启访问控制,我们通过--auth参数重启mongod服务。mongod --dbpath 存放数据库文件夹路径 --auth一旦开启了,用户连接mongod必须指定用户名和密码。
mongod --dbpath C:\mongodb --auth