1、前言
最近开始学习使用非关系型数据库MongoDB,并借此机会把学习心得记录下来,所以本博部分资源出自其他博客或记录,如果有侵犯您的权利,请联系mycg@163.com。
2、MongoDB简介
国际惯例,先做下MongoDB介绍:
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。
什么是NoSql? NoSql,全称是 Not Only Sql,指的是非关系型的数据库。下一代数据库主要解决几个要点:非关系型的、分布式的、开源的、水平可扩展的。原始的目的是为了大规模web应用,这场运动开始于2009年初,通常特性应用如:模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。
特点:
高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
- 面向集合存储,易存储对象类型的数据。
- 模式自由。
- 支持动态查询。
- 支持完全索引,包含内部对象。
- 支持查询。
- 支持复制和故障恢复。
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 自动处理碎片,以支持云计算层次的扩展性
- 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
- 文件存储格式为BSON(一种JSON的扩展)。
- 可通过网络访问。
功能:
- 面向集合的存储:适合存储对象及JSON形式的数据。
- 动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- 完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
- 查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
- 复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
- 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
- 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。
3、MongoDB的安装和配置
3.1)下载MongoDB:http://www.mongodb.org/downloads,以32位的2.0.8版本为例(因为目前高于该版本的暂不支持win xp~~),下载mongodb-win32-i386-2.0.8.zip到本地,将下载的包解压到D盘并重新命名为mongodb,可以看到D:\mongodb\bin里面的.exe文件。
官网安装指引:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/
3.2) 在“D:\mongodb”目录下新建“data”文件夹,它将会作为数据存放的根文件夹。
3.2) 配置MongoDB环境变量。右键 我的电脑 --->属性--->高级--->环境变量,追加D:\mongodb\bin到系统变量Path变量值后面,注意和前面的值用分号;隔开。
3.3)在命令下执行:mongod --dbpath D:\mongodb\data,看到类似下面的内容,说明环境变量配置成功并且成功部署和启动服务端。
也可以在浏览器输入:http://localhost:27017/,可以看到如下提示:
You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number
说明MongoDB数据库服务已经成功启动了。
4、命令操作实例
在MongoDB数据库服务成功启动的情况下,新开命令行窗口,通过命令mongo登录MongoDB shell,如下图
登录到默认test数据库,也可以通过mongo yourDateBaseName 登录到指定数据库(就算该数据库不存在,则新建,但必须往里面写数据才生效)。
MongoDB基本概念:
- 文档 --> 对应关系数据库的行,也就是一条记录。它比关系数据库的行的功能要强大,更像是是某个具体的对象。文档以一种Map的形式展现出来,当然value可以是任意的类型,也可以继续是一个文档(递归的定义)。
- 集合 --> 对应关系数据库的表。但是它又是无模式的,即文档不要求一致。
基本命令操作:
1、显示数据库
show dbs
2、创建数据库:
use yourDateBaseName 这就创建了一个数据库。
不过你用show dbs,并不能显示yourDataBaseName,因为这个数据库没有任何操作。所以如果你直接离开,则本数据库会被废除。
如果你插入一条记录,此时就可以通过show dbs看到对应的数据库
如下:
record = {"name" : "lios", "age" : 30, "password" : "123456"}
db.user.insert(record)
这时使用show dbs就可以看到你的数据库了
3、显示数据库
show collections。默认的包含system.indexes 表
4、创建集合:
因为mongodb中集合是无模式的,不像传统的关系型数据库是需要预先申明表包含哪些字段并且定义字段的属性。虽有无需预先定义。使用的时候直接插入。可以见上面的例子2。
5、删除集合
db.yourCollectionName.drop()
6、将文档插入集合
record = {"name" : "lin", "age" : 20, "password" : "123456"}
db.user.insert(record);
record = {"name" : "lios", "age" : 30, "password" : "123456"}
db.user.insert(record);
record = {"name" : "alicy", "age" : 18, "password" : "123456"}
db.user.insert(record);
7、删除集合中的文档
db.yourCollectionName.remove()
会清空此集合中的所有文档
8、文档更新:采用Mongo的修改器对文档进行修改。
修改器列表:
8.1、
8.1.1、“$set”修改器:用了指定一个健的值。如果健不存在,就创建它。
db.user.update({"name":"lios"}, {"$set" : {"sex" : "male"}})
也可以用自动生产的ID
db.user.update({"_id":ObjectId("510a141f387667b5aac35a82")}, {"$set" : {"sex" : "male"}})
8.1.2、“$unset”删除某个健
db.user.update({"name":"lios"}, {"$unset" : {"sex" : 1}})
8.2、“$inc”修改器用了增加已有的健的值(比如对age+2),或者在键不存在的时候创建一个健(比如该文档不存在age的建,这新建该建,并取值为2)。
db.user.update({"name":"lios"}, {"$inc" : {"age" : 2}})
Tips: $inc 只能用于整数,长整数和双精度浮点数。其他数会导致失败。
8.3、“$push”会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。
db.user.update({"name":"lios"}, {$push : {"comments" : "this is my comments"}})
8.4、“$addToSet”在不重复的情况下添加
db.user.update({"name":"lios"}, {"$addToSet" : {"comments" : "your comments"}})
8.5、“$each”数组遍历修改器
db.user.update({"name":"lios"}, {"$addToSet" : {"comments" : {"$each" : ["your comments", "a comments"]}}})
8.6、“$pop”修改器,从数组中删除任何一端删除元素
{$pop : {key : 1}}从数组末尾删除一个元素
{$pop : {key : -1}}从数组头部删除
如:
db.user.update({"name":"lios"}, {$pop:{"comments":1}})
9、upsert,如果存在就更新,如果不存在就根据update的条件插入一条新的记录
10、批量更新
需要设置update的第四个参数为true,否则默认更新第一个匹配的文档
12、查询全部集合
db.user.find()
如果是console的话,默认显示20条记录
db.user.findOne(); 查询并返回一个对象。如果没有找到则返回 null
13、1返回指定的键
db.user.find({"password":"123456"}, {"name":1, "age":1})
根据建password查询,返回键name和健age,同时默认返回_id键的值
14、0指定不返回的建
db.user.find({"password":"123456"}, {"name":0})
返回除name之外的其他键
15、判定条件查询
a) “$lt” 小于
b) “$lte”小于等于
c) “$gt”大于
d) “$gte”大于等于
e) “$ne”不等于
db.user.find({"age" : {"$gte" : 18, "$lte" : 30}})
16、其他条件查询
a) “$in” :是否在某一个集合的查询
db.user.find({"age" : {"$in" : [17,18,19]}})
b) “$nin”:与in相对应,不处于某个结合的文档
c) “$or”:多条件查询
db.user.find({"$or" : [{"age" : 17}, {"age" : 18}]})
d) “$not”非的情况下使用。其他条件可以基于它
e) “$mod”取模查询
f) “$null”可以匹配值为null的字段,同时也能匹配键不存在的文档
如果同时要判定键存在,需要加上"$exists" 判定
17、查询数组
a) “$all” 通过多个元素匹配数组(元素位置随意)
db.user.update({"name":"alicy"}, {"$addToSet" : {"comments" : "a comments"}})
db.user.update({"name":"alicy"}, {"$addToSet" : {"comments" : "your comments"}})
db.user.find({"comments" : {"$all" : ["your comments", "a comments"]}})
b) 数组下标匹配
db.user.find({"comments.2" : "a comments"})
c) "$size"数组长度匹配
db.user.find({"comments" : {"$size" : 2}})
18、采用点表示法查询内嵌文档(推荐)
db.user.update({"name":"lios"}, {"$set" : {"name" : {"first" : "lios", "last" : "L"}}})
db.user.update({"name":"lin"}, {"$set" : {"name" : {"first" : "lin", "last" : "L"}}})
db.user.find({"name.last" : "L"}) 对name的子键last做匹配
db.user.find({"name.last" : "L", "name.first" : "lios"})
19、采用分层的方式查询
db.user.find({"name" : {"last" : "L"}}) 注意这个查不出数据,因为这里是对name做全匹配
db.user.find({"name" : {"first" : "lios", "last" : "L"}})
20、查询后处理方法
coll.find( ... ).sort( {field :1[, field :1] }) 对返回结果进行排序(field ASC)。使用 -1 表示 DESC。
coll.find( ... ).sort( { field : 1 } ) 查找匹配 criteria 的对象,并对 field 进行排序。
coll.find( ... ).limit(n ) 限制结果返回 n 行。如果你只需要某几行数据,推荐这样做来获得最优性能。
coll.find( ... ).skip(n) 跳过 n 行结果。
coll.count() 返回聚集里对象的总数。
coll.find( ... ).count() 返回匹配该查询的对象总数。注意,该返回会忽略 limit 和 skip。比如有100行记录匹配该查询,但是limit为10,count() 仍会返回100。这比你自己循环更快,但仍然需要消耗些时间。
相关推荐
1. **安装 MongoDB.Driver** - 打开 Visual Studio,找到项目的 NuGet 包管理器。 - 搜索并安装 `MongoDB.Driver` 包。 - 这是 Mongodb .NET 驱动的核心组件。 **二、编写访问 Mongodb 的代码** ```csharp ...
3. 使用 `Mongo` 类初始化一个 MongoDB 服务实例,并通过 `GetDatabase` 和 `GetCollection` 方法获取数据库和集合。如果它们不存在,MongoDB 会自动创建。 4. 调用 `Connect` 方法建立与 MongoDB 服务器的连接。 5....
它可能从安装和启动MongoDB服务开始,然后介绍数据插入、查询和更新的基本语法。此外,它可能还涵盖了一些进阶主题,如聚合框架、地理空间索引和TTL(时间到生活)索引。学习手册通常会提供丰富的实例和练习,帮助...
连接MongoDB实例是使用Studio 3T的第一步。在"连接"面板中,点击"+"按钮创建新连接。你需要提供以下信息: 1. **主机名/地址**:填写MongoDB服务器的IP地址或域名。 2. **端口**:默认情况下,MongoDB监听在27017...
在本篇 MongoDB 学习笔记中,我们将聚焦于 MongoDB 的集群和分片(sharding)配置,这是实现大规模数据存储和处理的关键特性。 1. **MongoDB 集群**: - 集群是由多个独立的 MongoDB 实例组成的,它们共同提供高...
通过`MongoClient`和`MongoDatabase`等接口,开发者可以轻松地连接到MongoDB实例,操作数据库和集合。 `bson-3.6.4`库则是MongoDB Java驱动中处理BSON数据的部分。BSON是一种轻量级的、高效的表示数据的格式,类似...
在MongoDB的bin目录下,输入`mongo localhost:27017`,这将连接到本地的MongoDB实例。如果出现警告,可能是因为服务器是NUMA架构,为避免性能问题,建议按提示使用numactl工具启动MongoDB。 6. 配置自启动 为了使...
本篇文章将深入介绍MongoDB的基础知识,包括它的核心概念、安装与配置、数据模型、查询操作以及一些常用命令。 1. MongoDB的核心概念 - 文档数据库:MongoDB以JSON格式的文档存储数据,每个文档由键值对组成,支持...
在本“ios学习笔记二--电影网”的教程中,我们将深入探讨如何使用Node.js和Express框架构建一个简单的在线电影数据库。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得开发者能够在服务器端使用...
### MongoDB学习笔记知识点详解 #### 一、基本操作命令 **1. 切换数据库** 在MongoDB中,可以通过`use`命令来切换当前的工作数据库。例如,如果想要切换到名为`company`的数据库,可以执行如下命令: ```bash > ...
- MongoDB快速入门笔记(四)之MongoDB查询文档操作实例代码 - MongoDB快速入门笔记(六)之MongoDB的文档修改操作 - MongoDB快速入门笔记(六)之MongoDB删除文档操作 - MongoDB学习笔记(四) 用MongoDB的文档结构描述数据...
MongoDB 是一款强大的分布式文档型数据库,它使用 C++ 语言编写,专为 Web 应用提供可扩展的高性能数据存储解决方案。MongoDB 不仅仅是一个非关系型数据库,它的功能非常丰富,与传统的关系数据库相比有诸多优势,...
java操作mysql数据库的代码我们已经了如指掌了,增删改查,java对mongodb数据库也是类似的操作,先是数据库连接,再是进行操作。 首先我们进入进入admin数据库,然后建立自己的数据库testMongoDb,进入admin数据库后...
本文实例讲述了mongodb数据库下载、安装、启动、连接操作。分享给大家供大家参考,具体如下: 简介: MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决...
输入`showdbs`命令,可以查看当前MongoDB实例中的所有数据库。 3. 选择数据库 使用`use xxx`命令,可以切换到指定的数据库。如果该数据库不存在,并且执行了一个插入操作,MongoDB将会创建一个新的数据库。 4. ...
产品特点添加便条编辑笔记删除笔记列出所有笔记按标题查找注释高级设计屏幕截图与开发 -Javascript运行时 -NoSQL数据库-用于主机MongoDB实例(不manadatory请参见下面的其他选项。) -Node.js的Web应用程序框架用于...
我们还是以samus驱动为例来分析,samus驱动支持两种方式访问数据库,基本方式和linq方式,基本方式在上篇以介绍过,linq方式我不想单独讲解应用实例,这篇我会用两种方式来对比介绍。 一、包含子文档的集合操作 有...
MySQL DBA运维笔记详细介绍了数据库相关的基础知识以及MySQL数据库的管理和操作技巧,以下是详细的知识点梳理: 1. 数据库的种类: 1.1 关系型数据库介绍:关系型数据库是以行和列的形式存储数据,支持复杂的查询...
1. **启动实例**:首先,你需要在不同的服务器或同一服务器的不同端口上启动多个MongoDB实例。在启动时,使用`--replSet`参数指定副本集的名称,例如`rs2`。 2. **配置成员**:在MongoDB shell中,连接到任意一个...