MongoDb
2016-05-11 23:05
453 查看
http://pan.baidu.com/share/link?shareid=2634729037&uk=3422579373#path=%252F
http://www.cnblogs.com/fish-li/archive/2011/06/26/2090800.html#_labelStart http://www.cnblogs.com/chenqingwei/p/4084418.html http://www.cnblogs.com/fish-li/archive/2011/06/26/2090800.html
MongoDb 入门
1.下载MongoDB并解压:https://www.mongodb.com/download-center。
2.启动MongoDb服务方式:(mongod.exe就是Mongodb服务)
方式一:执行命令行(mongod.exe)方式安装Mongodb服务:
打开cmd命令窗口定位到MongoDb的bin目录下,输入命令mongod.exe --dbpath:"D:\mongodbData\data"。
配置环境变量:我的电脑-属性-高级系统设置-环境变量-系统变量-找到path-编辑,在最后一个“\”后加一个“;”,然后把MongoDb的bin目录的路径粘贴-确定。
方式二:以windows服务方式安装MongoDb服务
以管理员身份打开cmd命令窗口定位到MongoDb的bin目录下,输入命令:mongod --install --dbpath:D:\mongodbData\data --logpath D:\mongodbData\data\log\mongodb.log --port 27017 --logappend --bind_Ip 127.0.0.1.(必须先建立好文件夹)
启动mongodb服务:net start mongodb
卸载mongodb服务:cmd 转到c盘根目录,sc delete mongodb
参数列表:--install:表示以windows服务安装Mongodb,--ddpath: 表示数据库所在文件夹路径,D:\mongodbData\data路径实在D盘中建立的文件夹路径(也可将该文件建在Mongodb的bin文件夹中).
--logpath:表示日志文件路径,-port:端口号,默认是27017,--bind_id:绑定的服务ip. (默认为本机ip), .至于mongod的更多命令行参数,请输入命令: mongod /?来获得。
也可将这些参数写在一个mongodb.conf 文件中,然后输入命令 mongod --install --config “C:\Users\v-lozhu\Downloads\mongodb-win32-x86_64-enterprise-windows-64-3.4.6\bin\mongodb.conf”来安装mongodb服务,如下:
安装Mongodb服务后,在windows service中可以看到Mongodb服务已经启动:
在数据库文件data中生成了一些mongodb相关的文件:
4.通过cmd命令窗口使用mongo命令连接mongodb服务器进行操作mongodb数据库:
打开cmd命令窗口定位到MongoDb的bin目录下,输入命令:mongo 127.0.0.1:27017
之后就可以使用命令来对mongodb数据库进行操作了
5.顺便提一下:运行mongod后,它会显示一些有用的信息。比如:pid (进程ID), tcp port (监听端口),
http 端口(用于查看运行状态), 操作系统版本,数据目录,32
or 64位版本,如果是32位版本,它还会告诉你【数据有2G的限制】,所以正式使用建议运行64位版本。
6.下载MongoDb 的C#驱动(Mongodb.dll),以让我们在C#中使用Mongodb。我们在C#访问MongoDB所需的驱动就是项目MongoDB了。编译这个项目就能得到了,文件名:MongoDB.dll。
7.在C#使用MongoDB:
在项目中引用Mongodb.dll,
创建一个实体类:Customer.cs:
代码中的[MongoId]也是可以不要的,
说明一下:MongoDB在使用前,并不要求您事先创建好相应的数据库,设计数据表结构!
在MongoDB中,没有【表】的概念,取而代之的是【集合】,也没有【数据记录】的概念,取而代之的是【文档】, 我们可以把【文档】理解成一个【对象】,任意的对象,甚至可以有复杂的嵌套层次。因此,我们不用再写代码从【数据表字段】到C#类的【属性,字段】的转换了,现在直接就可以读写整个对象了。而且MongoDB不支持Join操作,所以,如果有【关联】操作,就需要你自己来处理。
封装Mongodb:
8.下表将帮助您更容易理解Mongo中的一些概念:
1)数据库
"show dbs" 命令可以显示所有数据的列表,执行 "db" 命令可以显示当前数据库对象或集合,运行"use"命令,可以连接到一个指定的数据库。
数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。
不能是空字符串("")。
不得含有' '(空格)、.、$、/、\和\0 (空宇符)。
应全部小写。
最多64字节。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合 config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
2)文档
文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
一个简单的文档例子如下:
下表列出了 RDBMS 与 MongoDB 对应的术语:
需要注意的是:
文档中的键/值对是有序的。
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
键不能含有\0 (空字符)。这个字符用来表示键的结尾。
.和$有特别的意义,只有在特定环境下才能使用。
以下划线"_"开头的键是保留的(不是严格要求的)。
3)集合:db.col.findOne()
合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
比如,我们可以将以下不同数据结构的文档插入到集合中:
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
固定大小的集合:建一个capped collection, 指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的:db.createCollection("mycoll",{capped:true,
size:100000}),指定的存储大小包含了数据库的头信息。
在capped collection中,你能添加新的对象。能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。数据库不允许进行删除。使用drop()方法删除collection所有的行。注意: 删除之后,你必须显式的重新创建这个collection。在32bit机器中,capped collection最大存储为1e9( 1X109)个字节。
4)元数据
数据库的元数据是存储在集合中。它们使用了系统的命名空间:dbname.system.*
在MongoDB数据库中名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection),如下:
对于修改系统集合中的对象有如下限制。
在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。
{{system.users}}是可修改的。 {{system.profile}}是可删除的。
5)Mongodb数据类型
下表为MongoDB中常用的几种数据类型。
9.Mongodb Shell 命令
use runoob , show dbs, db.
1)删除数据库: use runoob db.dropDatabase()
2)向数据库插入文档:
>use runoob
>db.col.insert({title:'MongoDB
教程', description:'MongoDB 是一个 Nosql 数据库',by:'菜鸟教程',
url:'http://www.runoob.com', tags:['mongodb','database','NoSQL'],
likes:100})
> db.col.find() /db.col.find().pretty()
{"_id":ObjectId("56064886ade2f21f36b03134"),"title":"MongoDB
教程","description":"MongoDB 是一个 Nosql 数据库","by":"菜鸟教程","url":"http://www.runoob.com","tags":["mongodb","database","NoSQL"],"likes":100}
也可以将数据定义为一个变量,然后再插入:
> document=({title:'MongoDB 教程',
description:'MongoDB 是一个 Nosql 数据库',by:'菜鸟教程',
url:'http://www.runoob.com', tags:['mongodb','database','NoSQL'],
likes:100});
> db.col.insert(document)WriteResult({"nInserted":1})
插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
3)更新文档:
update 方法:
>db.col.update({'title':'MongoDB
教程'},{$set:{'title':'MongoDB'}})
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true :>db.col.update({'title':'MongoDB
教程'},{$set:{'title':'MongoDB'}},{multi:true}).
save方法:save() 方法通过传入的文档来替换已有文档
>db.col.save({"_id":ObjectId("56064f89ade2f21f36b03136"),"title":"MongoDB","description":"MongoDB
是一个 Nosql 数据库","by":"Runoob","url":"http://www.runoob.com","tags":["mongodb","NoSQL"],"likes":110})
只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
4)删除文档
>db.col.remove({'title':'MongoDB
教程'})
如果你只想删除第一条找到的记录可以设置 justOne 为 1:db.col.remove({'title','MongoDB 教程'},{'justOne ',1})
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):>db.col.remove({})
5)查询文档
>db.col.find()或>db.col.find().pretty():pretty()
方法以格式化的方式来显示所有文档。还有一个db.col.findOne() 方法,它只返回一个文档。
条件查询:
and 条件查询:MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,类似常规 SQL 的 AND 条件。
db.col.find({"by":"菜鸟教程","title":"MongoDB
教程"}).pretty(),类似于 WHERE 语句:WHERE by='菜鸟教程' AND title='MongoDB 教程'
or条件查询:db.col.find({$or:[{"by":"菜鸟教程"},{"title":"MongoDB
教程"}]}).pretty()
AND 和 OR 联合查询:db.col.find({"likes":{$gt:50},
$or:[{"by":"菜鸟教程"},{"title":"MongoDB
教程"}]}).pretty(),类似常规 SQL 语句为:'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')'
6)条件操作符:
MongoDB中条件操作符有:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
7)$type操作符:$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
MongoDB 中可以使用的类型如下表所示:
如果想获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令:
db.col.find({"title":{$type:2}})
8)limit()与skip()方法:
如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
db.col.find({},{"title":1,_id:0}).limit(2)
可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
9)Mongodb排序
在MongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
按字段 likes 的降序排列:
10)Mongodb索引
MongoDB使用 ensureIndex() 方法来创建索引。、
db.col.ensureIndex({"title":1,"description":-1})
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。ensureIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
ensureIndex() 接收可选参数,可选参数列表如下:
在后台创建索引: db.values.ensureIndex({open:1,
close:1},{background:true})
11)Mongodb聚合:
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
MongoDB中聚合的方法使用aggregate()。
计算每个作者所写的文章数,使用aggregate()计算结果如下:
> db.mycol.aggregate([{$group:{_id:"$by_user",
num_tutorial:{$sum:1}}}])
{"result":[{"_id":"w3cschool.cc","num_tutorial":2},{"_id":"Neo4j","num_tutorial":1}],"ok":1}
类似sql语句: select by_user, count(*) from mycol group by by_user
下表展示了一些聚合的表达式:
12)Mongodb管道:
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
聚合框架中常用的几个操作:
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。$limit:用来限制MongoDB聚合管道返回的文档数。$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。$group:将集合中的文档分组,可用于统计结果。$sort:将输入文档排序后输出。$geoNear:输出接近某一地理位置的有序文档。
13)Mongodb 复制
14)Mongodb分片
15)Mongodb备份与恢复
16)Mongodb监控
http://www.cnblogs.com/fish-li/archive/2011/06/26/2090800.html#_labelStart http://www.cnblogs.com/chenqingwei/p/4084418.html http://www.cnblogs.com/fish-li/archive/2011/06/26/2090800.html
MongoDb 入门
1.下载MongoDB并解压:https://www.mongodb.com/download-center。
2.启动MongoDb服务方式:(mongod.exe就是Mongodb服务)
方式一:执行命令行(mongod.exe)方式安装Mongodb服务:
打开cmd命令窗口定位到MongoDb的bin目录下,输入命令mongod.exe --dbpath:"D:\mongodbData\data"。
配置环境变量:我的电脑-属性-高级系统设置-环境变量-系统变量-找到path-编辑,在最后一个“\”后加一个“;”,然后把MongoDb的bin目录的路径粘贴-确定。
方式二:以windows服务方式安装MongoDb服务
以管理员身份打开cmd命令窗口定位到MongoDb的bin目录下,输入命令:mongod --install --dbpath:D:\mongodbData\data --logpath D:\mongodbData\data\log\mongodb.log --port 27017 --logappend --bind_Ip 127.0.0.1.(必须先建立好文件夹)
启动mongodb服务:net start mongodb
卸载mongodb服务:cmd 转到c盘根目录,sc delete mongodb
参数列表:--install:表示以windows服务安装Mongodb,--ddpath: 表示数据库所在文件夹路径,D:\mongodbData\data路径实在D盘中建立的文件夹路径(也可将该文件建在Mongodb的bin文件夹中).
--logpath:表示日志文件路径,-port:端口号,默认是27017,--bind_id:绑定的服务ip. (默认为本机ip), .至于mongod的更多命令行参数,请输入命令: mongod /?来获得。
也可将这些参数写在一个mongodb.conf 文件中,然后输入命令 mongod --install --config “C:\Users\v-lozhu\Downloads\mongodb-win32-x86_64-enterprise-windows-64-3.4.6\bin\mongodb.conf”来安装mongodb服务,如下:
安装Mongodb服务后,在windows service中可以看到Mongodb服务已经启动:
在数据库文件data中生成了一些mongodb相关的文件:
4.通过cmd命令窗口使用mongo命令连接mongodb服务器进行操作mongodb数据库:
打开cmd命令窗口定位到MongoDb的bin目录下,输入命令:mongo 127.0.0.1:27017
之后就可以使用命令来对mongodb数据库进行操作了
5.顺便提一下:运行mongod后,它会显示一些有用的信息。比如:pid (进程ID), tcp port (监听端口),
http 端口(用于查看运行状态), 操作系统版本,数据目录,32
or 64位版本,如果是32位版本,它还会告诉你【数据有2G的限制】,所以正式使用建议运行64位版本。
6.下载MongoDb 的C#驱动(Mongodb.dll),以让我们在C#中使用Mongodb。我们在C#访问MongoDB所需的驱动就是项目MongoDB了。编译这个项目就能得到了,文件名:MongoDB.dll。
7.在C#使用MongoDB:
在项目中引用Mongodb.dll,
创建一个实体类:Customer.cs:
public class Customer { [MongoId] public string CustomerID { get; set; } public string CustomerName { get; set; } public string ContactName { get; set; } public string Address { get; set; } public string PostalCode { get; set; } public string Tel { get; set; } }
代码中的[MongoId]也是可以不要的,
说明一下:MongoDB在使用前,并不要求您事先创建好相应的数据库,设计数据表结构!
在MongoDB中,没有【表】的概念,取而代之的是【集合】,也没有【数据记录】的概念,取而代之的是【文档】, 我们可以把【文档】理解成一个【对象】,任意的对象,甚至可以有复杂的嵌套层次。因此,我们不用再写代码从【数据表字段】到C#类的【属性,字段】的转换了,现在直接就可以读写整个对象了。而且MongoDB不支持Join操作,所以,如果有【关联】操作,就需要你自己来处理。
封装Mongodb:
public class MyMongoDb : IDisposable { private Mongo _mongo; private IMongoDatabase _db; public MyMongoDb() : this("Server=172.0.0.1", "MyNorthwind") { } public MyMongoDb(string connectionString, string dbName) { if (string.IsNullOrEmpty(connectionString)) { throw new ArgumentNullException("connectionString"); } _mongo = new Mongo(connectionString); //立即连接 _mongo.Connect(); if (!string.IsNullOrEmpty(dbName)) { _db = _mongo.GetDatabase(dbName); } } //切换到指定的数据库 public IMongoDatabase UseDb(string dbName) { if (string.IsNullOrEmpty(dbName)) throw new ArgumentNullException("dbName"); _db = _mongo.GetDatabase(dbName); return _db; } //获取当前连接的数据库 public IMongoDatabase CurrentDb { get { if (_db == null) { throw new Exception("当前没有指定任何数据库,请在构造函数中指定数据库或调用UseDb切换数据库。"); } return _db; } } //获取当前连接数据库的指定集合(依据类型) public IMongoCollection<T> GetCollection<T>() where T : class { return this.CurrentDb.GetCollection<T>(); } //获取当前连接数据库的指定集合(依据指定名称) public IMongoCollection<T> GetCollection<T>(string name) where T : class { return this.CurrentDb.GetCollection<T>(name); } public void Dispose() { if (_mongo != null) { _mongo.Dispose(); _mongo = null; } } }创建MongoDbHelper.cs:(MongoDb的增删改查)
public class MongoDbHelper { //private static readonly string _connectionStrng = "Server=127.0.0.1"; //private static readonly string __dbName = "MyNorthwind"; ////新增记录 //public void Insert(Customer customer) //{ // customer.CustomerID = Guid.NewGuid().ToString("N"); // using (Mongo mongo = new Mongo(_connectionStrng))//创建一个连接 // { // mongo.Connect();//打开连接 // var db = mongo.GetDatabase(__dbName);//切换到指定的数据库 // var collection = db.GetCollection<Customer>( );//根据类型获取相应的集合 // collection.Insert(customer);//向集合中插入相应的对象 // } //} ////删除记录 //public void Delete(string customerId) //{ // using (Mongo mongo = new Mongo(_connectionStrng)) // { // mongo.Connect(); // var db = mongo.GetDatabase(__dbName); // var collection = db.GetCollection<Customer>(); // collection.Remove(c => c.CustomerID == customerId);//从集合中删除指定的对象 // } //} ////更新记录 //public void Update(Customer customer) //{ // using (Mongo mongo = new Mongo(_connectionStrng)) // { // mongo.Connect(); // var db = mongo.GetDatabase(__dbName); // var collection = db.GetCollection<Customer>(); // collection.Update(customer, (c => c.CustomerID == customer.CustomerID)); // } //} ////获取分页列表 //public List<Customer> GetList(string searchWord, PagingInfo pagingInfo) //{ // using (Mongo mongo = new Mongo(_connectionStrng)) // { // mongo.Connect(); // var db = mongo.GetDatabase(__dbName); // var collectin = db.GetCollection<Customer>(); // var query = from c in collectin.Linq()//先建一个查询 // select c; // if (!string.IsNullOrEmpty(searchWord))//增加查询过滤条件 // { // query = query.Where(c => c.CustomerName.Contains(searchWord) || // c.Address.Contains(searchWord)); // } // //先按名称排序,再返回分页结果 // IOrderedQueryable<Customer> orderedCustomer = query.OrderBy(c => c.CustomerName); // return null; // } //} //public Customer GetById(string customerId) //{ // using (Mongo mongo = new Mongo(_connectionStrng)) // { // mongo.Connect(); // var db = mongo.GetDatabase(__dbName); // var collection = db.GetCollection<Customer>(); // //查询单个对象 // Customer customer = collection.FindOne(c => c.CustomerID == customerId); // return customer; // } //} public void Insert(Customer customer) { customer.CustomerID = Guid.NewGuid().ToString("N"); using (MyMongoDb mongo = new MyMongoDb()) { mongo.GetCollection<Customer>().Insert(customer); } } public void Delete(string customerId) { using (MyMongoDb mongo = new MyMongoDb()) { mongo.GetCollection<Customer>().Remove(c => c.CustomerID == customerId); } } public void Update(Customer customer) { using (MyMongoDb mongo = new MyMongoDb()) { mongo.GetCollection<Customer>().Update(customer, (c => c.CustomerID == customer.CustomerID)); } } public Customer GetById(string customerId) { using (MyMongoDb mongo = new MyMongoDb()) { return mongo.GetCollection<Customer>().FindOne(c=>c.CustomerID==customerId ); } } }
8.下表将帮助您更容易理解Mongo中的一些概念:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
1)数据库
"show dbs" 命令可以显示所有数据的列表,执行 "db" 命令可以显示当前数据库对象或集合,运行"use"命令,可以连接到一个指定的数据库。
数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。
不能是空字符串("")。
不得含有' '(空格)、.、$、/、\和\0 (空宇符)。
应全部小写。
最多64字节。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合 config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
2)文档
文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
一个简单的文档例子如下:
{"site":"www.runoob.com", "name":"菜鸟教程"}
下表列出了 RDBMS 与 MongoDB 对应的术语:
RDBMS | MongoDB |
---|---|
数据库 | 数据库 |
表格 | 集合 |
行 | 文档 |
列 | 字段 |
表联合 | 嵌入文档 |
主键 | 主键 (MongoDB 提供了 key 为 _id ) |
数据库服务和客户端 | |
Mysqld/Oracle | mongod |
mysql/sqlplus | mongo |
文档中的键/值对是有序的。
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
键不能含有\0 (空字符)。这个字符用来表示键的结尾。
.和$有特别的意义,只有在特定环境下才能使用。
以下划线"_"开头的键是保留的(不是严格要求的)。
3)集合:db.col.findOne()
合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
比如,我们可以将以下不同数据结构的文档插入到集合中:
{"site":"www.baidu.com"} {"site":"www.google.com","name":"Google"} {"site":"www.runoob.com","name":"菜鸟教程","num":5}
合法的集合名
集合名不能是空字符串""。集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
固定大小的集合:建一个capped collection, 指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的:db.createCollection("mycoll",{capped:true,
size:100000}),指定的存储大小包含了数据库的头信息。
在capped collection中,你能添加新的对象。能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。数据库不允许进行删除。使用drop()方法删除collection所有的行。注意: 删除之后,你必须显式的重新创建这个collection。在32bit机器中,capped collection最大存储为1e9( 1X109)个字节。
4)元数据
数据库的元数据是存储在集合中。它们使用了系统的命名空间:dbname.system.*
在MongoDB数据库中名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection),如下:
集合命名空间 | 描述 |
---|---|
dbname.system.namespaces | 列出所有名字空间。 |
dbname.system.indexes | 列出所有索引。 |
dbname.system.profile | 包含数据库概要(profile)信息。 |
dbname.system.users | 列出所有可访问数据库的用户。 |
dbname.local.sources | 包含复制对端(slave)的服务器信息和状态。 |
在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。
{{system.users}}是可修改的。 {{system.profile}}是可删除的。
5)Mongodb数据类型
下表为MongoDB中常用的几种数据类型。
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Arrays | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
use runoob , show dbs, db.
1)删除数据库: use runoob db.dropDatabase()
2)向数据库插入文档:
>use runoob
>db.col.insert({title:'MongoDB
教程', description:'MongoDB 是一个 Nosql 数据库',by:'菜鸟教程',
url:'http://www.runoob.com', tags:['mongodb','database','NoSQL'],
likes:100})
> db.col.find() /db.col.find().pretty()
{"_id":ObjectId("56064886ade2f21f36b03134"),"title":"MongoDB
教程","description":"MongoDB 是一个 Nosql 数据库","by":"菜鸟教程","url":"http://www.runoob.com","tags":["mongodb","database","NoSQL"],"likes":100}
也可以将数据定义为一个变量,然后再插入:
> document=({title:'MongoDB 教程',
description:'MongoDB 是一个 Nosql 数据库',by:'菜鸟教程',
url:'http://www.runoob.com', tags:['mongodb','database','NoSQL'],
likes:100});
> db.col.insert(document)WriteResult({"nInserted":1})
插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
3)更新文档:
update 方法:
>db.col.update({'title':'MongoDB
教程'},{$set:{'title':'MongoDB'}})
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true :>db.col.update({'title':'MongoDB
教程'},{$set:{'title':'MongoDB'}},{multi:true}).
save方法:save() 方法通过传入的文档来替换已有文档
>db.col.save({"_id":ObjectId("56064f89ade2f21f36b03136"),"title":"MongoDB","description":"MongoDB
是一个 Nosql 数据库","by":"Runoob","url":"http://www.runoob.com","tags":["mongodb","NoSQL"],"likes":110})
只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
4)删除文档
>db.col.remove({'title':'MongoDB
教程'})
如果你只想删除第一条找到的记录可以设置 justOne 为 1:db.col.remove({'title','MongoDB 教程'},{'justOne ',1})
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):>db.col.remove({})
5)查询文档
>db.col.find()或>db.col.find().pretty():pretty()
方法以格式化的方式来显示所有文档。还有一个db.col.findOne() 方法,它只返回一个文档。
条件查询:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value>} | db.col.find({"by":"菜鸟教程"}).pretty() | where by = '菜鸟教程' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
db.col.find({"by":"菜鸟教程","title":"MongoDB
教程"}).pretty(),类似于 WHERE 语句:WHERE by='菜鸟教程' AND title='MongoDB 教程'
or条件查询:db.col.find({$or:[{"by":"菜鸟教程"},{"title":"MongoDB
教程"}]}).pretty()
AND 和 OR 联合查询:db.col.find({"likes":{$gt:50},
$or:[{"by":"菜鸟教程"},{"title":"MongoDB
教程"}]}).pretty(),类似常规 SQL 语句为:'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')'
6)条件操作符:
MongoDB中条件操作符有:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
7)$type操作符:$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
MongoDB 中可以使用的类型如下表所示:
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1. |
Max key | 127 |
db.col.find({"title":{$type:2}})
8)limit()与skip()方法:
如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
db.col.find({},{"title":1,_id:0}).limit(2)
可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
9)Mongodb排序
在MongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
按字段 likes 的降序排列:
10)Mongodb索引
MongoDB使用 ensureIndex() 方法来创建索引。、
db.col.ensureIndex({"title":1,"description":-1})
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。ensureIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
ensureIndex() 接收可选参数,可选参数列表如下:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
close:1},{background:true})
11)Mongodb聚合:
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
MongoDB中聚合的方法使用aggregate()。
计算每个作者所写的文章数,使用aggregate()计算结果如下:
> db.mycol.aggregate([{$group:{_id:"$by_user",
num_tutorial:{$sum:1}}}])
{"result":[{"_id":"w3cschool.cc","num_tutorial":2},{"_id":"Neo4j","num_tutorial":1}],"ok":1}
类似sql语句: select by_user, count(*) from mycol group by by_user
下表展示了一些聚合的表达式:
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在结果文档中插入值到一个数组中。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
聚合框架中常用的几个操作:
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。$limit:用来限制MongoDB聚合管道返回的文档数。$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。$group:将集合中的文档分组,可用于统计结果。$sort:将输入文档排序后输出。$geoNear:输出接近某一地理位置的有序文档。
13)Mongodb 复制
14)Mongodb分片
15)Mongodb备份与恢复
16)Mongodb监控
相关文章推荐
- MongoDB 性能优化:分析执行计划
- MongoDB 性能优化:分析执行计划
- [mongoDB] mongoDb
- mongodb的备份、恢复、迁移、回滚
- Ubuntu mongodb 安装和配置
- Cassandra HBase和MongoDb性能比较
- Invalid command: files\mongoDB\log\log.txt
- Ubuntu 14.04下安装mongodb及测试
- mongodb修改用户密码的2种方法
- windoes10下 如何将mongoDB配置为服务
- MongoDB集群配置
- windows下MongoDB的安装及配置
- mongodb
- MongoDB ObjectId结构说明
- mongodb
- 如何使用php文件测试mongodb是否安装成功
- MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询
- Mongodb的主从模式搭建实例
- mongodb C++ driver调用存储过程
- mongodb C++ driver CMakeList配置