2

前言

本周开发写mongodb的查询语句,不知道该怎么写。于是正好了解一下 Mongodb 的相关知识。

什么是MongoDB?

noSql

MongoDB是面向文档NoSQL 数据库,用于大量数据存储。MongoDB是一个在2000年代中期问世的数据库。

这里的 noSql 指 non-relational 非关系型, 或者 Not Only SQL。

传统的关系型数据库,比如 mysql,在设置表之间的关联的时候,往往会设置外键等约束,使得进行更新数据的时候有限制。 当处理大量数据的时候,系统响应时间就会变慢。

image.png

而后面推出的 Nosql, 则是非关系型数据库。

image.png

与关系型数据库相比:

  • nosql 没有固定的行列,表结构是动态的,很灵活
  • 不需要对象关系映射和数据规范化
  • 在大数据量下,nosql速度更快

NoSQL数据库有很多种,常见的主要有如下几种分类:

  • 键值数据库(Redis、Memcached)
  • 文档数据库(MongoDB、CouchDB)
  • 宽列数据库(Cassandra、HBase)
  • 图数据库(Neo4J、OrientDB)

而今天我们要说的就是 文档数据库 MongoDB

下面我们看看 传统行列式数据库 和 文档数据库

image.png

左侧是传统行列式数据库,我们可以看到有行和列,而在右侧,我们有一个文档数据库,该数据库的结构与JSON类似。现在,对于关系数据库,必须知道拥有哪些列,依此类推。但是,对于文档数据库,具有JSON对象之类的数据存储。我们不需要定义,以便使其灵活。

MongoDB

MongoDB官方文档

文档数据库 将数据作为 类JSON 的文档存储和查询。它是由字段和值对组成的数据结构, 字段的值可以包括其他文档,数组和文档数组。

image.png

MongoDB中的主键

在MongoDB中,_id字段是集合的主键, 类型是 ObjectID。

默认情况下,在集合中插入文档时,如果没有在字段名称中添加带有_id的字段名称,则MongoDB将自动添加一个Object id字段,下图所示

image.png

MongoDB 一开始的设计就是用来做为分布式数据库, 所以不可能像mysql一样,id 从 0 到 n自增。

它是由MongoDB 中开源的分布式系统 ID 算法ObjectId()生成的

new ObjectId("632c6d93d65f74baeb22a2c9")

官网 OBjectId 文档

The 12-byte ObjectId consists of:

  • A 4-byte timestamp, representing the ObjectId's creation, measured in seconds since the Unix epoch.
  • A 5-byte random value generated once per process. This random value is unique to the machine and process.
  • A 3-byte incrementing counter, initialized to a random value.

即为 4 字节的时间戳(单位:秒) + 5 个字节的进程唯一标识 + 3 个字节自增数

我们可以得出以下结论:

  • 因为前 4 个字节使用了时间戳,以 “秒” 为单位,总体上是递增的,所以可以根据 _id 进行时间排序
  • 中间 5 个字节随机值,是进程唯一标识,在进程启动之后,只需要生成一次。
  • 后 3 个字节为自增数,1 个字节等于 8 位,在 1 秒之内,可以产生 Math.pow(2, 24) - 1 = 16777215 个唯一 ID。 可实现千万级数据生成

创建数据库

“use”命令可以创建MongoDB中的数据库。如果数据库不存在,将创建一个新的数据库
image.png

创建表(集合)

创建集合的最简单方法是创建一条记录插入到集合中。如果该集合不存在,则会创建一个新的集合。

db.Employee.insert({
"EmployeeId":1
"EmployeeName":"张三"
})

结果: 插入成功
image.png

查询

MongoDB提供了一个名为db.collection.find()的函数.

db.Employee.find({EmployeeName : "张三"});

操作符

$eq

查询age=20的文档:

db.person.find( { age: { $eq: 20 } } )

相当于:

db.person.find( { age: 20 } )

$gt

查询 age > 20 的文档:

db.person.find( { age: { $gt: 20 } } )

$ne

匹配不等于(≠)指定值的文档

查询 age != 20 的文档:

db.person.find( { age: { $ne: 20 } } )

$in

查询 age 与数组中的任意值相等的文档:

db.person.find( { age: { $in: [ 25, 24 ] } } )

$or

查询 age<20 或者 address 是beijing的文档:

db.person.find( { $or: [ { age: { $lt: 20 } }, { address: "beijing" } ] } )

$exists

db.person.find( { phone: { $exists: true } } )

$set

假设现有文档:

{_id:1,name:"zhangsan",sex:"男"}

如果这样写:

db.person.update({_id:1},{sex:"女"});

则更改之后的结果是这样的:

{_id:1,sex:"女"}

若只想更改sex字段,可以这样写:

db.person.update({_id:1},{$set:{sex:"女"}});

$and

查询 age<20 并且address是beijing的文档:

db.person.find( { $and: [ { age: { $lt: 20 } }, { address: "beijing" } ] } )

weiweiyi
1k 声望123 粉丝

« 上一篇
flutter了解
下一篇 »
DHCP协议