前言
本周开发写mongodb的查询语句,不知道该怎么写。于是正好了解一下 Mongodb 的相关知识。
什么是MongoDB?
noSql
MongoDB是面向文档的 NoSQL 数据库,用于大量数据存储。MongoDB是一个在2000年代中期问世的数据库。
这里的 noSql 指 non-relational 非关系型, 或者 Not Only SQL。
传统的关系型数据库,比如 mysql,在设置表之间的关联的时候,往往会设置外键等约束,使得进行更新数据的时候有限制。 当处理大量数据的时候,系统响应时间就会变慢。
而后面推出的 Nosql, 则是非关系型数据库。
与关系型数据库相比:
- nosql 没有固定的行列,表结构是动态的,很灵活
- 不需要对象关系映射和数据规范化
- 在大数据量下,nosql速度更快
NoSQL数据库有很多种,常见的主要有如下几种分类:
- 键值数据库(Redis、Memcached)
- 文档数据库(MongoDB、CouchDB)
- 宽列数据库(Cassandra、HBase)
- 图数据库(Neo4J、OrientDB)
而今天我们要说的就是 文档数据库 MongoDB。
下面我们看看 传统行列式数据库 和 文档数据库
左侧是传统行列式数据库,我们可以看到有行和列,而在右侧,我们有一个文档数据库,该数据库的结构与JSON类似。现在,对于关系数据库,必须知道拥有哪些列,依此类推。但是,对于文档数据库,具有JSON对象之类的数据存储。我们不需要定义,以便使其灵活。
MongoDB
文档数据库 将数据作为 类JSON 的文档存储和查询。它是由字段和值对组成的数据结构, 字段的值可以包括其他文档,数组和文档数组。
MongoDB中的主键
在MongoDB中,_id字段是集合的主键, 类型是 ObjectID。
默认情况下,在集合中插入文档时,如果没有在字段名称中添加带有_id的字段名称,则MongoDB将自动添加一个Object id字段,下图所示
MongoDB 一开始的设计就是用来做为分布式数据库, 所以不可能像mysql一样,id 从 0 到 n自增。
它是由MongoDB 中开源的分布式系统 ID 算法ObjectId()生成的
new ObjectId("632c6d93d65f74baeb22a2c9")
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中的数据库。如果数据库不存在,将创建一个新的数据库
创建表(集合)
创建集合的最简单方法是创建一条记录插入到集合中。如果该集合不存在,则会创建一个新的集合。
db.Employee.insert({
"EmployeeId":1
"EmployeeName":"张三"
})
结果: 插入成功
查询
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" } ] } )
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。