珠峰培训

mongodb初级入门(二)使用

作者:

2015-11-23 16:31:41

153

MongoDB 数据库的概念

不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。

下表将帮助您更容易理解Mongo中的一些概念:

通过下图实例,我们也可以更直观的的了解Mongo中的一些概念:

一、数据库

1、一个mongodb中可以建立多个数据库。

2、MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

3、数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。

1.不能是空字符串("")。
2.不得含有' '(空格)、.、$、/、\和\0 (空宇符)。
3.应全部小写。
4.最多64字节。

4、有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

1.admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。

2.local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合 

3.config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

二、文档

文档是mongodb中的最核心的概念,是其核心单元,我们可以将文档类比成关系型数据库中的每一行数据。

多个键及其关联的值有序的放置在一起就是文档。MongoDB使用了BSON这种结构来存储数据和网络数据交换。

BSON数据可以理解为在JSON的基础上添加了一些json中没有的数据类型。

如果我们会JSON,那么BSON我们就已经掌握了一半了,至于新添加的数据类型后面我会介绍。

文档例子如下:

{name:"张三",age:20,hobby:["看书","旅游","唱歌"]}

需要注意的是:

1. 文档中的键/值对是有序的。

2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌人的文档)。

3. MongoDB区分类型和大小写。

4. MongoDB的文档不能有重复的键。

5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

1 键不能含有\0 (空字符)。这个字符用来表示键的结尾。

2 .和$有特别的意义,只有在特定环境下才能使用。

3 以下划线"_"开头的键是保留的(不是严格要求的)。

三、集合

集合就是一组文档的组合。如果将文档类比成数据库中的行,那么集合就可以类比成数据库的表。

在mongodb中的集合是无模式的,也就是说集合中存储的文档的结构可以是不同的,比如下面的两个文档可以同时存入到一个集合中:

{"name":"mengxiangyue"}
{"Name":"mengxiangyue","sex":"nan"}
注:当第一个文档插入时,集合就会被创建。

合法的集合名

1. 集合名不能是空字符串""。

2. 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。

3. 集合名不能以"system."开头,这是为系统集合保留的前缀。

4. 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。 

四、 MongoDB 数据类型

下表为MongoDB中常用的几种数据类型。

mongodb服务的启用

1.找到mongodb安装目录 按下Shift+鼠标右键 选择 在此处打开命令窗口

2.命令窗体中输入 mongod --dbpath=D:\Mongodb\data 按回车键

注: --dbpath后的值表示数据库文件的存储路径 而且后面的路径必须存在否则服务开启失败

注意:这个命令窗体不能关 关闭这个窗口就相当于停止了mongodb服务

CMD 连接本地mongodb数据库

1.找到mongodb安装目录 按下Shift+鼠标右键 选择 在此处打开命令窗口

2.命令窗体中输入 mongo --host=127.0.0.1 或者 mongo 按回车键

注:--host后的值表示服务器的ip地址

备注: --host=127.0.0.1 表示的就是本地数据库 每次数据库都会默认连接test数据库

CMD 连接远程服务器上的mongodb数据库

1.找到mongodb安装目录 按下Shift+鼠标右键 选择 在此处打开命令窗口

2.命令窗体中输入 mongo --host=123.57.143.189. 按回车键

注:--host后的值表示服务器的ip地址

备注: --host=123.57.143.189 表示连接ip是123.57.143.189服务器上的mongodb数据库 每次数据库都会默认连接test数据库

MongoDB 创建数据库

语法结构

use database_name      database_name代表数据库的名字
注:如果数据库不存在,则创建数据库,否则切换到指定数据库

实例

以下实例我们创建了数据库 person:

MongoDB查看所有数据库

语法结构

show dbs
注:我们刚创建的数据库 person 如果不在列表内, 要显示它,我们需要向 person 数据库插入一些数据 db.person.insert({name:"zhangSan",age:30})

实例

MongoDB查看当前使用的数据库

语法结构

db 或 db.getName()  
注:db代表的是当前数据库 也就是person这个数据库

实例

MongoDB 删除数据库

语法结构

db.dropDatabase() 

实例

MongoDB 断开与mongodb服务的连接

语法结构

exit  

实例

MongoDB 查看命令api

语法结构

help   

实例

>

操作集合方法

查看帮助api

语法

db.worker.help()

实例

查看当前数据库下有哪集合(collection)

语法

show collections

实例

创建集合(collection)

1. 使用 db.createCollection(collection_Name)方法

语法

db.createCollection("collection_Name")     collection_Name集合的名称

2. 使用 db.collection_Name.insert(document)方法

语法

db.collection_Name.insert(document)    collection_Name集合的名称    document要插入的文档

实例

注:两者的区别在于前者创建了一个空的worker集合 后者创建了一个空的worker集合并添加了一个Document数据

删除当前数据库中的集合(collection)

语法

db.collection_Name.drop()    collection_Name 集合的名称

实例

插入文档

1、 使用insert()方法插入文档

语法

db.collection_name.insert(document)   collection_name集合的名字    document插入的文档

实例

db.worker.insert({name:'zpx',age:6}) 向worker集合添加一个{name:'zpx',age:6}的Document 

db.worker.insert([{name:'wangWu',age:50},{name:'xiaoMing',age:60}]) 向worker集合添加多个[{name:'wangWu',age:50},{name:'xiaoMing',age:60}] 的Documen

2、 使用save()方法插入文档

语法

db.collection_name.save(document)   collection_name集合的名字    document插入的文档
注:如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。 

实例

db.person.save({name:"xiaoHong",age:50})

db.person.save({_id:ObjectId("562c9caf671c978b6596e825"),name:"xiaoHong",age:10})

MongoDB 更新文档

1.update()方法用于更新已存在的文档

语法

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

参数说明:

query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$set,$inc...)等 $inc在原基础上累加后更新   $set直接更新
upsert  : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi  : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern  :可选,抛出异常的级别。

实例

db.worker.update({name:'liSi'},{$set:{name:'liSi_update'}}) 将document数据中name是liSi 的数据的name修改为liSi_update
注:如果有多条name是liSi的数据只更新一条

db.worker.update({name:'liSi_update'}, {$set: {age:40}},{multi:true}) 将document数据中name是liSi_update 的数据的age修改为 40
注:如果有多条name是liSi的数据这些数据全部更新

db.worker.update({name:'liSi_update'},{$inc:{age:1}}) 将document数据中name是lliSi_update 的数据的age在原来的基础上加1

2.save()方法通过传入的文档来替换已有文档

语法

db.collection.save(
<document>,
{
writeConcern: <document>
}

参数说明:

  document : 文档数据。
  writeConcern  :可选,抛出异常的级别。

实例

db.person.save({_id:ObjectId("562c9caf671c978b6596e825"),name:"xiaoHong",age:10})

MongoDB 删除文档

remove()方法是用来移除集合中的数据。

注:在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。

语法

db.collection.remove(
   <query>,
   <justOne>
)
如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:
db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

参数说明:

query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档。
writeConcern  :(可选)抛出异常的级别。

实例

db.worker.remove({name:'fJianZhou'}) 删除worker集合里name是fJianZhou的所有Document数据

db.person.remove({name:"xiaoHong"},1)  删除person集合里name是xiaoHong的第一条数据

MongoDB 查询文档

1.find()方法

语法

db.collection_name.find()  collection_name 集合的名字

实例

db.worker.find()  查询worker下所有的document数据

2.find()方法 查询指定列

语法

db.collection_name.find({queryWhere},{key:1,key:1}) collection_name 集合的名字 key要显示字段  1表示显示  queryWhere参阅查询条件操作符

实例

db.worker.find({},{age:1}) 查询指定列 

3.pretty()方法以格式化的方式来显示所有文档。

语法

db.collection_name.find().pretty()   collection_name 集合的名字

实例

 db.worker.find().pretty()

4.findOne()方法查询匹配结果的第一条数据

语法

db.collection_name.findOne()  collection_name 集合的名字

实例

db.worker.findOne()  查询worker下的第一条数据

查询条件操作符

描述:条件操作符用于比较两个表达式并从mongoDB集合中获取数据。

1.MongoDB (>) 大于操作符 - $gt

语法

db.collectionName.find({<key>:{$gt:<value>}}) collectionName集合名词    key字段    value值

实例

db.worker.find({age:{$gt:30}}) 查询age 大于 30的数据

2.MongoDB(>=)大于等于操作符 - $gte

语法

db.collectionName.find({<key>:{$gte:<value>}}) collectionName集合名词    key字段    value值

实例

db.worker.find({age: {$gte: 30}}) 查询age 3大于等于30 的数据

3.MongoDB (<) 小于操作符 - $lt

语法

db.collectionName.find( {<key>:{$lt:<value>}}) collectionName集合名词    key字段    value值

实例

db.worker.find({age: {$lt: 30}}) 查询age 小于30的数据

4.MongoDB (<=) 小于等于操作符 - $lte

语法

 db.collectionName.find({<key>:{$lte:<value>}}) collectionName集合名词    key字段    value值

实例

db.worker.find({age: {$lte: 30}}) 查询age 小于等于30的数据

5.MongoDB 使用 (>=) 和 (<=) 查询 - $gte 和 $lte

语法

 db.collectionName.find({<key>:{$gte:<value>},<key>:{$lte:<value>}}) collectionName集合名词    key字段    value值

实例

db.worker.find({age: {$gte: 30, $lte: 50}}) 查询age 大于等于 30 并且 age 小于等于 50  的数据

6.MongoDB 等于(==)

语法

 db.collectionName.find({<key>:<value>,<key>:<value>})   collectionName集合名词    key字段    value值

实例

db.worker.find({"age": 30})`查询age = 30的数据

7.MongoDB 使用 _id进行查询

语法

db.collectionName.find({"_id" : ObjectId("value")})  value _id的值

实例

db.worker.find({"_id" : ObjectId("562af23062d5a57609133974")}) 查询_id是 562af23062d5a57609133974 数据

8.MongoDB 查询某个结果集的数据的条数

语法

db.collectionName.find().count()   collectionName集合名称

实例

db.worker.find().count() 

9.MongoDB 查询某个字段的值当中是否包含另一个值

语法

db.collection.find({key:/value/})   collectionName集合名称 key 字段  value值

实例

db.worker.find({name:/value/}) 查询name里包含zhang的数据

10.MongoDB 查询某个字段的值当中是否以另一个值开头

语法

db.collection.find({key:/^value/})   collectionName集合名称 key 字段  value值

实例

db.worker.find({name:/^zhang/})

查询条件and和or

1.MongoDB AND 条件

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开

语法

db.col.find({key1:value1, key2:value2}).pretty()  

实例

db.worker.find({name:'zhangRenYang',age:30}) 查询name是zhangRenYang并且age是30的数据

2.MongoDB OR 条件

MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

语法

db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
)

实例

db.worker.find({$or:[{age = 30},{age = 50}]}) 查询age = 30 或者 age = 50  的数据

3.AND 和 OR 联合使用

语法

db.col.find(
   {
     key1:value1, 
     key2:value2,
     $or: [
         {key1: value1}, 
         {key2:value2}
     ]
   }
)

实例

 查询 name是zhangRenYang 并且 age是30 或者 age是 50 的数据
 db.worker.find({name:'zhangRenYang',$or:[{age:30},{age:50}]}) 

MongoDB Limit与Skip方法

1.MongoDB Limit() 方法 读取指定数量的数据记录

语法

db.collectionName.find().limit(number)    collectionName集合    number读取的条数

实例

db.worker.find().limit(3) 查询前3条数据

2.MongoDB Skip() 方法 跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

语法

db.collectionName.find().skip(number)    collectionName集合    number跳过的条数

实例

db.worker.find().skip(3) 查询3条以后的数据

3.MongoDB Skip()方法和Limit()方法混合使用

注: 通常用这种方式来实现分页功能

语法

db.collectionName.find().limit(number).skip(number)  

实例

db.worker.find().sort({age:-1}) 查询在4-6之间的数据

排序

MongoDB sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。

语法

db.collectionName.find().sort({KEY:1}) 或者 db.collectionName.find().sort({KEY:-1})  collectionName集合  key表示字段   

实例

db.worker.find().sort({age:1}) 查询出并升序排序 {age:1}  age表示按那个字段排序 1表示升序

db.worker.find().sort({age:-1})  查询出并降序排序  {age:-1} age表示按那个字段排序 -1表示降序