mongodb中关联的为数组如何查询_MongoDB数据库之基本概念

MongoDB是面向集合的文档式数据库,不像关系数据库那样,有表,列、行,MongoDB数据库则是由一系列的文档组成。以下介绍MongoDB的基本概念。

2e408092782698956705b28e204f9f47.png

1.1 文档

文档是MongoDB数据库的最小集合单位,其基本概念为:由多个键及其关联的值有序组合在一起的集合单元。

如{“One”:3, ”Two”:”Hello,MongoDB”}

可以将文档看成关系数据库中的行,每个键/值组合可以看成是这个行中对应的列,键表示列的名称,值则为表列值。

文档的值不仅可以是字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。文档的键是字符串。

文档定义有如下要求:

1. 键不能含有0(空字符),在MongoDB中,这个字符用来表示的结尾

2. .和$有特别含义,在特定环境中使用,使用这两个字符时。需考虑清楚。

3. 以下划线“_”开头的键也是系统保留字符。使用时需要考虑清楚

4. 键是区分大小写的,如{“One”:”Hello”,”one’:”hello”},则表示不同的键

5. 在同一个文档中,不能有相同名称的键。即大小写都相同的键,如下面的文档是非法的:

{“one”:”hello”,”one”:”helloworld”}

6. 文档中的键值的类型可以不一样的,如:

{“one”:1,”two”:”helloworld”,”three”:0.21}

7. 文档中的键/值对是有序的,下面两个文档是完全不同的:

{“One”:3,”Two”:”Hello,MongoDB”}

{”Two”:”Hello,MongoDB” , “One”:3}

1.2 集合

集合即是一组文档,如果说文档类似于行的话,则集合则相当于表。

在MongoDB中,集合是无模式的,即一个集合中的文档可以各式各样的。在集合中,不同的文档的键值数目可以不一样,其中的键也可以不一样。不同文档同一个键,其值可以不一样,类型也可不一样。在同一个集合中,文档是相互独立的。

集合命令的规范。集合名可以是满足下列条件的任意UTF-8字符串:

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

2. 集合名不能含有0字符(空字符),MongoDB中此字符表示集合名的结尾;

3. 集合名不能以”system.”开头,因为此前缀是系统本身保留的前缀,如system.uses表示系统用户信息,system.namespaces保存所有数据库集合的信息;

4. 集合名称不能有$字符。

1.3 数据库

多个集合组成数据库。一个MongoDB实例中可以有多个数据库,每个数据库都是完全独立的,有自己的用户,权限信息,即便在磁盘上,其存储的文件也是分开的,这和SQL server之类的数据库一样。不同数据库其数据库文件可以存放在不同的目录。数据库命名规则如下:

1. 不能是空字符串;

2. 不得含有’’(空格)、.、$、/、、和0(空字符);

3. 应全部小写;

4. 最多64个字节。

1.4 数据类型

MongoDB的文档使用BSON来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供日期、时间戳、32位数字、64位数字、符号、对象id、正则表达式、代码、二进制数据、最大最小值、未定义、内嵌文档等类型。以下对MongoDB的一些类型进行简要说明:

1. 对象id

对象id是文档中唯一的12位的ID ,在MongoDB来存储文档时,必须有一个“_id”键,这个键可以是任何类型,如果在增加文档时,没有这个_id键,则系统会使用ObjectId对象自动生成一个。

2. 正则表达式

文档键值可以包含正则表达式,其正则表达式采用JS语法来表示,如:{“one”:/ho/i}

3. 代码

文档中可以包含JS代码 如:{“one”:function(){}}

4. 未定义

文档中也可以使用未定义类型,如{“x”:undefined}。

5. 数组

文档中的值可以表示为数组,但数组并没有严格控制数据内成员的类型,数组内成员其类型可以完全不一样,而且,在数组内还可以嵌套数组。

6. 内嵌文档

内嵌文档是将另一个文档当成这个文档中某个键的值。这样似乎更合理的体现了数据的关系,如我们要表示某个博客文章及其作者,在关系型数据库中,我们一般要建立两个表,一个表示表示博客文章(article),另一个则表示博客的作者(author),然后建立外键关系来控制。而在MongoDB中我们这样表示 :

{“_id”: ObjectId("4e75d586f2723d6f1d886771"),”title”:”blog Test”,

”author”:{“name”:wangXiao,”fullname”:”wangxiaolin”},”Content”:”Blos test”}

同样,我们也可将其设计成:

{“_id”: ObjectId("4e75d586f2723d6f1d886771"),”title”:”blog Test”,”author”:” ObjectId("6e75c586f2723d6f1d886791")”,”Content”:”Blos test”}

{“_id”: ObjectId("6e75c586f2723d6f1d886791") ,“name”:wangXiao,”fullname”:”wangxiaolin”}

分成两个文档来表示。

虽然将文档加上子文档会更好体现数据间的关系,在查询时更容易查询到数据相关联的信息,但会造成数据冗余,不利于数据管理。当然,采用不同的设计方式,还需依使用场景来决定。

喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,一起进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值