【MongoDB】关于Mongodb的学习与总结

摘要:
直接阅读mongodb官方网站上的文档是最快的方式。链接如下:https://docs.mongodb.com/manual/tutorial/getting-started/一、Mongodb的基本概念是关系数据库和非关系数据库之间的产品。它是非关系数据库中应用程序功能最丰富的数据库,与关系数据库最相似。它支持的数据结构非常松散,类似于json的bjson格式,因此可以存储复杂的数据类型。M

 直接去看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的学习与总结第1张

免责声明:文章转载自《【MongoDB】关于Mongodb的学习与总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇转载:winform的DataGridView中用C#实现按钮列置灰SpringBoot中log4j的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转]Android 操作SQLite基本用法

在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面。本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的。一.SQLite的介绍1.SQLite简介SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入  式的,而且目前已经在很多嵌入...

SQL Server内存理解的误区

 SQL Server内存理解 内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求,提高数据读写的效率。 内存对数据库而言是如此的重要,因此只要在涉及数据库优化的地方,我们都可以看到内存的身影。我们通常会想尽各种办法来优化数据库内存的使用...

mongodb 安装

a.安装   本人下载的是windows版本的3.2.1mongo,路径为https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.2.1-signed.msi   或者直接去官网也可以http://www.mongodb.org/downloads   不过需要注意的是mo...

Oracle—dblink创建与使用

一、DbLink的创建 1.PLSQL图文方式 2.SQL方式 -- Drop existing database link drop database link LINK_NC_ZS; -- Create database link create database link LINK_NC_ZS connect to ZSFNC identi...

mysql通过数据文件恢复数据方法

情况描述:服务器硬盘损坏,服务器换了个新硬盘 ,然后老硬盘插在上面。挂载在这台机器。可以从老硬盘里面拿到数据。只拿到了里面的mysql数据文件夹,把数据文件夹覆盖新的服务器mysql数据文件夹 启动报错!!!报错!!!错!!!。 数据文件如下: 于是觉得不能使用覆盖文件的方式还原数据,得使用科学方法恢复。google之…… 找到解决办法如下: 可以发现数...

shell 脚本操作informix数据库

shell 脚本操作informix数据库的简单模板: functionName(){ dbaccess << ! database 库名; sql语句; ! } 栗子1:更新数据 functionName(){ nameStr=$1 idStr=$2 dbaccess << ! da...