一、简介
由于工作需要,最近使用了NoSQL的典型代表——MongoDB数据库。这个在2011年被炒的沸沸扬扬的东东,据说在2010年会成为《2012最受企业欢迎的开发技能Top10》之一。
首先了解几个关键词:
NoSQL:是相对于我们熟知的MS Sql Server和My SQL这种关系型数据库来说的,关系型数据库的最大特点就是遵循范式,就想教科书里定义的一二三范式、BC范式等记不住的公式。
所以,范式用非官方的说法应该是这样的:
第一范式:不能表中套表;
第二范式:每个表有且只有一个主键;
第三范式:表与表之间的关系只能通过外键引用。
No SQL可以翻译为“没有SQL”或者是“Not Only SQL”,即反SQL运动,是一项全新的数据库革命。
随着网络的飞速发展和各种Web2.0网站的兴起,特别是超大规模的和高并发的SNS类型的社交网站和web2.0的纯动态网站已经显得力不从心了,面对海量的数据和几十万、几百万的
访问量和高并发量,暴露出许多难以克服的问题。
正所谓乱世出英雄,在这样的环境中,MongoDB就出现了。
MongoDB:
MongoDB是NoSQL的典型代表。它是一种介于关系型和非关系型数据库之间的产品。它是面向集合的(Collections-Oriented)。与MongoDB同类型的产品有Hadoop等。
二、用法
1、安装服务端
首先,下载安装MongoDB服务端程序,下载地址:http://www.mongodb.org/downloads ;windows环境下下载到是一堆.exe可执行文件。
其次,在安装exe之前,需要手动为MongoDB创建一个存放数据的目录,如 “D:\mongoDB\data\db”;
安装:打开cmd命令行,切换至mongoDB的bin目录,启动mongoDB的服务器:mongod.exe -dbpath "D:\mongoDB\data\" ,效果如图所示:
默认端口号:27017
可以通过 localhost:28017查看服务端运行情况。
2、使用客户端管理工具
bin目录下的mongo.exe是MongoDB的客户端工具,以命令行形式对MongoDB进行CRUD以及查看等操作。在cmd下将目录切换至bin目录,运行 mongo.exe即可连上服务端。
常用命令有:
show dbs; //显示所有的数据库
use TestDB;//使用该数据库,注意,MongoDB大小写敏感
show collections;//显示表,在MongoDB中是集合
db; // 显示当前使用的数据库
db.Test.find();//select * from Test
db.Test.remove();//delete from Test
db.Test.count();//select count(*) from Test
db.runCommand({"serverStatus" : 1}); //获取服务端状态
db.test2.update({ "_id" : "2" }, { $inc : {shoe : 1} }) //找到记录并修改,实现自增1的效果
三、.Net下驱动用法
1、首先需要下载MongoDB for C#的驱动,即2个dll文件,MongoDB.Bson.dll和MongoDB.Driver.dll
2、C#的增删改查方法
插入:
static void InsertToCollection1(string word)
{
// 插入到collection1中
BsonArray bsonArr = new BsonArray();
for (int j = 0; j < 5; j++)
{
if (!String.IsNullOrEmpty(dict1[word][j]))
{
bsonArr.Add(dict1[word][j]);
}
}
QueryDocument query = new QueryDocument("_id", word);
UpdateDocument update = new UpdateDocument("$set", new BsonDocument("arr", bsonArr));
collection1.Update(query, update, UpdateFlags.Upsert);
}
更新:
static void Update(string words)
{
QueryDocument query = new QueryDocument("_id", words);
// 自增1
UpdateDocument update = new UpdateDocument("$inc", new BsonDocument("c", 1));
collection2.Update(query, update);
}
四、MongoDB客户端语法
数据集(表)操作语法
db.test.find({id:10}) 返回test数据集ID=10的数据集
db.test.find({id:10}).count() 返回test数据集ID=10的数据总数
db.test.find({id:10}).limit(2) 返回test数据集ID=10的数据集从第二条开始的数据集
db.test.find({id:10}).skip(8) 返回test数据集ID=10的数据集从0到第八条的数据集
db.test.find({id:10}).limit(2).skip(8) 返回test数据集ID=1=的数据集从第二条到第八条的数据
db.test.find({id:10}).sort() 返回test数据集ID=10的排序数据集
db.test.findOne([query]) 返回符合条件的一条数据
db.test.getDB() 返回此数据集所属的数据库名称
db.test.getIndexes() 返回些数据集的索引信息
db.test.group({key:...,initial:...,reduce:...[,cond:...]})
db.test.mapReduce(mayFunction,reduceFunction,<optional params>)
db.test.remove(query) 在数据集中删除一条数据
db.test.renameCollection(newName) 重命名些数据集名称
db.test.save(obj) 往数据集中插入一条数据
db.test.stats() 返回此数据集的状态
db.test.storageSize() 返回此数据集的存储大小
db.test.totalIndexSize() 返回此数据集的索引文件大小
db.test.totalSize() 返回些数据集的总大小
db.test.update(query,object[,upsert_bool]) 在此数据集中更新一条数据
db.test.validate() 验证此数据集
db.test.getShardVersion() 返回数据集共享版本号
db.test.find({'name':'foobar'}) select * from test where name='foobar'
db.test.find() select * from test
db.test.find({'ID':10}).count() select count(*) from test where ID=10
db.test.find({'ID':{$in:[25,35,45]}}) select * from test where ID in (25,35,45)
db.test.find().sort({'ID':-1}) select * from test order by ID desc
db.test.distinct('name',{'ID':{$lt:20}}) select distinct(name) from test where ID<20
select name,sum(marks) from test group by name
db.test.find('this.ID<20',{name:1}) select name from test where ID<20
db.test.insert({'name':'foobar','age':25}) insert into test ('name','age') values('foobar',25)
db.test.insert({'name':'foobar','age':25,'email':'test@163.com'})
db.test.remove({}) delete * from test
db.test.remove({'age':20}) delete test where age=20
db.test.remove({'age':{$lt:20}}) delete test where age<20
db.test.remove({'age':{$lte:20}}) delete test where age<=20
db.test.remove({'age':{$gt:20}}) delete test where age>20
db.test.remove({'age':{$gte:20}}) delete test where age>=20
db.test.remove({'age':{$ne:20}}) delete test where age!=20
db.test.update({'name':'foobar'},{$set:{'age':36}}) update test set age=36 where name='foobar'
db.test.update({'name':'foobar'},{$inc:{'age':3}}) update test set age=age+3 where name='foobar'