【MongoDB】个人学习与使用总结

 直接去看mongodb官网的文档学习是最快捷的途径。链接如下:https://docs.mongodb.com/manual/tutorial/getting-started/

一、基础概念

Mongodb是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中应用功能最丰富的,最像关系数据库的数据库。它支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点在于它支持查询语言非常强大,语法类似于面向对象的查询语言,可以实现类似关系数据库中单表查询的绝大部分功能,而且支持对数据创建索引。它是面向集合的存储方式。每个集合在数据库中有唯一的标识名称,可包含无限个数目的文档。集合的概念类似于关系型数据库中的表,但不同的是它不需要定义任何模式。文档是这个数据库的基本单位,类似于关系数据库中的行的概念,但是比行复杂。多个键及其关联的值有序地存放在一起就构成了文档。集合是一组文档,一个数据库中可以有多个不同的集合。一个Mongodb实例可以承载多个数据库,数据库之间相互独立,但有三个系统数据库在Mongodb创建之初就存在,即为:

● Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。
● Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。
● Config 数据库:当MongoDB 使用分片模式时,config 数据库在内部使用,用于保存分片的信息。
 

MongoDB的使用场景有以下几个方面:

● 网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
● 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载。
● 大尺寸、低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
● 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持。
● 用于对象及JSON 数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。
MongoDB 的使用也会有一些限制,例如,它不适合于以下几个地方。
● 高度事务性的系统:例如,银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
● 传统的商业智能应用:针对特定问题的BI 数据库会产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
● 需要SQL 的问题。
 
目前已经使用Mongodb的公司有:
  • Craiglist上使用MongoDB的存档数十亿条记录。
  • FourSquare,基于位置的社交网站,在Amazon EC2的服务器上使用MongoDB分享数据。
  • Shutterfly,以互联网为基础的社会和个人出版服务,使用MongoDB的各种持久性数据存储的要求。
  • bit.ly, 一个基于Web的网址缩短服务,使用MongoDB的存储自己的数据。
  • spike.com,一个MTV网络的联营公司, spike.com使用MongoDB的。
  • Intuit公司,一个为小企业和个人的软件和服务提供商,为小型企业使用MongoDB的跟踪用户的数据。
  • sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储。
  • etsy.com ,一个购买和出售手工制作物品网站,使用MongoDB。
  • 纽约时报,领先的在线新闻门户网站之一,使用MongoDB。
  • CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB。

1、Collection(集合)

Create a Collection(创建集合)

如果不存在集合,则在您第一次为该集合存储数据时,MongoDB会创建该集合。

db.myNewCollection2.insertOne( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )

Explicit Creation(显式创建)

MongoDB提供db.createCollection()方法来显式创建具有各种选项的集合,例如设置最大大小或文档验证规则。如果未指定这些选项,则无需显式创建集合,因为在首次存储集合数据时,MongoDB会创建新集合。

Document Validation(文件验证)

默认情况下,集合不需要其文档具有相同的架构;即,单个集合中的文档不需要具有相同的字段集,并且字段的数据类型可以在集合中的不同文档之间有所不同。

但是,从MongoDB 3.2开始,您可以在更新和插入操作期间对集合强制执行文档验证规则。有关详细信息,请参见架构验证

Modifying Document Structure(修改文件结构)

要更改集合中文档的结构,例如添加新字段,删除现有字段或将字段值更改为新类型,请将文档更新为新结构。

Unique Identifiers(唯一标识符)

集合被分配了一个不变的UUID。集合UUID在副本集的所有成员和分片群集中的分片上均保持相同。

2、Documents(文档)

Mongodb将数据记录为BSON文档,BSON文档是JSON文件的二进制表示形式。文档结构是由字段和值对组成,具有以下结构:

{ 
   field1 : value1 ,
   field2 : value2 ,
   field3 : value3 ,
   ... 
   fieldN : valueN 
}

字段的值可以是任何BSON数据类型,包括其他文档,数组和文档数组。

var mydoc = {
   _id: ObjectId("5099803df3f4948bd2f98391"),
   name: { first: "Alan", last: "Turing" },
   birth: new Date(‘Jun 23, 1912‘),
   death: new Date(‘Jun 07, 1954‘),
   contribs: [ "Turing machine", "Turing test", "Turingery" ],
   views : NumberLong(1250000)
}

上面的字段具有以下数据类型:

  • _id拥有一个ObjectId
  • name包含一个字典。
  • birthdeath保留Date类型的
  • contribs持有字符串数组
  • views拥有NumberLong类型的值

Field Names(字段名)

字段名称是字符串。字段名_id被用来保存主键,它的值必须在collection中保持唯一,可以是数组以外的任何类型。另外,字段名称不能包含空字符;在3.6版本后允许字段名称包含以“.”或者“$”开头的字段名称。

虽然BSON文档可能有多个具有相同名称的字段。但是,大多数MongoDB接口代表的MongoDB具有不支持重复字段名称的结构(例如哈希表)。如果需要处理具有多个同名字段的文档,请参见驱动程序的驱动程序文档

Dot Notation(点表示法,点取值法)

MongoDB使用点表示法来访问数组的元素并访问嵌入式文档的字段。

"<array>.<index>"

比如:

{
   ...
   contribs: [ "Turing machine", "Turing test", "Turingery" ],
   ...
}

要指定contribs数组中的第三个元素,请使用点符号“ contribs.2”。

具体数组的查询,详见

Embedded Documents(嵌入文档)

要使用点符号指定或访问嵌入式文档的字段,请将嵌入式文档名称与点(.)和字段名称连接在一起,并用引号引起来:

{
   ...
   name: { first: "Alan", last: "Turing" },
   contact: { phone: { type: "cell", number: "111-222-3333" } },
   ...
}

要在名称字段中指定名为last的字段,请使用点符号“ name.last”。 要在电话文档中的联系人字段中指定号码,请使用点符号“contact.phone.number”。

具体字典查询,详见:

The _id Field(id字段)

在MongoDB中,存储在集合中的每个文档都需要一个唯一的_id字段作为主键。如果插入的文档省略了_id字段,则MongoDB驱动程序会自动为_id字段生成ObjectId。

_id字段具有以下行为和约束:

  • 默认情况下,MongoDB在创建集合时会在_id字段上创建唯一索引。
  • _id字段始终是文档中的第一个字段。如果服务器首先接收到没有_id字段的文档,则服务器会将字段移到开头。
  • _id字段可以包含任何BSON数据类型的值,只要不是数组。

Other Uses of the Document Structure(使用其他文档结构)

除了定义数据记录,MongoDB还在整个文档结构中使用,包括但不限于:查询过滤器,更新规范文档和索引规范文档。

Query Filter Documents(查询过滤文档)

查询过滤器文档指定确定用于选择哪些记录以进行读取,更新和删除操作的条件。

您可以使用<field>:<value>表达式指定相等条件和查询运算符表达式。

{
  <field1>: <value1>,
  <field2>: { <operator>: <value> },
  ...
}

例子可详见:

Update Specification Documents(更新某个特殊文档)

更新规范文档使用更新运算符来指定要在db.collection.update()操作期间对特定字段执行的数据修改。

{
  <operator1>: { <field1>: <value1>, ... },
  <operator2>: { <field2>: <value2>, ... },
  ...
}

更多可详见: Update specifications.

Index Specification Documents(特殊文档索引)

索引规范文档定义了要索引的字段和索引类型:

{ <field1>: <type1>, <field2>: <type2>, ...  }

未完待续!

【MongoDB】个人学习与使用总结

上一篇:MongoDB Cluster 数据平衡优化


下一篇:mysql分批删除数据