【mongodb】Mongodb初识

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

NoSQL

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

mongoDB安装

https://www.cnblogs.com/cbw-mango/p/7987682.html

也可以下载msi格式的 http://www.runoob.com/mongodb/mongodb-window-install.html

问题:安装mongodb时,最后一步,一直卡着不动

是因为到最后一步时,左下角的勾勾没有去掉,mongodb compass是图形化管理界面,下载它需要很久很久,还有可能一直下不来,所以把勾去掉就能马上安装好。

 基础

在mongodb中基本的概念是文档、集合、数据库,

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table

collection

数据库表/集合

row

document

数据记录行/文档

column

field

数据字段/域

index

index

索引

table joins

 

表连接,MongoDB不支持

primary key

primary key

主键,MongoDB自动将_id字段设置为主键

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

 

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

MongoDB的默认数据库为"db",该数据库存储在data目录中。

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

"show dbs" 命令可以显示所有数据库的列表。

Show collections  显示所有表(集合)的列表

在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

文档的数据结构和JSON基本一样。

所有存储在集合中的数据都是BSON格式。

BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON

例如:

{

Name: xx,

Title:yy

}

 语句

【命令行/Robo可视化工具】

插入

向集合(表)中插入文档(行)

>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

以上实例中 col 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

查看已插入文档:

> db.col.find()

插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。

更新

MongoDB 使用 update() 和 save() 方法来更新集合中的文档。

db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})

标题(title)由原来的 "MongoDB 教程" 更新为了 "MongoDB"。

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

C# 中判断是否更新成功

 

可以通过updateResult.ModifedCount>0 去判断

  

查询

MongoDB 与 RDBMS Where 语句比较

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

操作

格式

范例

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

find() 方法以非结构化的方式来显示所有文档。

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

>db.col.find().pretty()

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

除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

多条件 且查询,等同and

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。

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

或查询 or

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

查询大于某个时间,小于某个时间,在某一段时间范围

(>) 大于 - $gt

(<) 小于 - $lt

(>=) 大于等于 - $gte

(<= ) 小于等于 - $lte

1.Date方式

例如查询ct>=2012.12.7 且et<=2012.12.7:可翻译为

"ct":{$gte:new Date(2012,11,7)},"et":{$lte:new Date(2012,11,7)}

如下是查询日期大于等于2016年12月1日的记录条数(注意,中间的月份写11,就是12月)

db.xxx.find({"ct":{$gte:new Date(2016,11,1)}})

2.ISODate方式

ISODate("2016-01-01T00:00:00Z")

查询某些字段

完整的定义

db.collection.find(query, projection)

若不指定 projection,则默认返回所有键,指定 projection 格式如下,有两种模式

db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的键,不返回其他键。。1代表包括
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的键,返回其他键

_id 键默认返回,需要主动指定 _id:0 才会隐藏

两种模式不可混用(因为这样的话无法推断其他键是否应返回)

db.collection.find(query, {title: 1, by: 0}) // 错误

只能全1或全0,除了在inclusion模式时可以指定_id为0

db.collection.find(query, {_id:0, title: 1, by: 1}) // 正确

若不想指定查询条件参数 query 可以 用 {} 代替,但是需要指定 projection 参数:

querydb.collection.find({}, {title: 1})
querydb.collection.find({})  也是可以的

限定结果条数

如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。

db.COLLECTION_NAME.find().limit(NUMBER)

还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

db.col.find({},{"title":1,_id:0}).limit(1).skip(1)

以下实例只会显示第二条文档数据

想要读取从 10 条记录后 100 条记录,相当于 sql 中limit (10,100)。

> db.COLLECTION_NAME.find().skip(10).limit(100)

以上实例在集合中跳过前面 10 条返回 100 条数据。

skip 和 limit 结合就能实现分页。

不要轻易使用Skip来做查询,否则数据量大了就会导致性能急剧下降,这是因为Skip是一条一条的数过来的,多了自然就慢了。

排序

降序:sort({MailSendTime:-1})

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

索引

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构

db.collection.createIndex(keys, options)

语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。

>db.col.createIndex({"title":1})

createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。

>db.col.createIndex({"title":1,"description":-1})

聚合

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

通过字段 by_user 字段对数据进行分组,并计算 by_user 字段相同值的总和。

_id、num_tutorial 是结果的别名

 Robo工具的使用

1、显示1000条,右边切换不同的显示

 

复制数据

 

需要使用mongodump备份与恢复

命令行中执行:

备份

Mongodump –h 127.0.0.1 –d testOne –o e:\mongodb\data\dump

备份本地mongo中的testOne数据库到本地目录e:\mongodb\data\dump下,会自动创建文件夹testOne

远程:

mongodump –h xxxx:27001 –d DB –o e:\mongodb\data\dump\dev

还原

mongorestore -h 127.0.0.1 -d db e:\mongodb\data\dump\dev\InfrastructureDB

猜你喜欢

转载自www.cnblogs.com/peterYong/p/9885445.html