MongoDB不支持外键,事务,数据类型约定的非关系型数据库。
在MongoDB中,一个数据库包含多个集合,类似于MySQL中一个数据库包含多个表;一个集合包含多个文档,类似于MySQL中一个表包含多条数据。
文档是MongoDB的核心,多个键及其关联的值放在一起就是文档。在Mongodb中使用一种类json的bson存储数据,bson数据可以理解为在json的
基础上添加了一些json中没有的的数据类型。
启动:
$sudo service mongodb start $mongo #进入到mongo命令行
集合和文档的基本操作:
createCollection():创建集合
db.COLLECTION.drop():删除集合
db.COLLECTION_NAME.insert(document):插入文档
db.COLLECTION_NAME.update(SELECTION_CRITERIA,UPDATED_DATA):更新文档
db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA}):替换已存在的文档
db.COLLECTION_NAME.remove(DELECTION_CRITERIA):删除文档
数据库操作:
use DatabaseName #创建连接到test数据库
show dbs #查看所有数据库
(空数据库不显示/显示test(empty))
db.dropDatabase() #销毁数据库
db.createCollection(COLLECTION_NAME) #创建集合
show collections #查看集合 >db.users.insert([ ... {name:"jam", ... email:"jam@qq.com" ... }, ... {name:"tom", ... email:"tom@qq.com" ... } ... ])#插入数据,如果插入时users集合没有创建会自动创建 >db.COLLECTION_NAME.save([ ... {name:"jam", ... email:"jam@qq.com" ... }, ... {name:"tom", ... email:"tom@qq.com" ... } ... ])#插入数据,如果插入时users集合没有创建会自动创建(相当于update) db.COLLECTION_NAME.update(SELECTION_CRITERIA,UPDATE_DATA) #update >db.shiyanlou.update({key1:value1,key2:value2},{$set:{key2:value2}},{multi:true})
#默认的 update 函数只对一个文档更新,如果想作用所有文档,则需要加入 multi:true
替换已存在的文档
db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})
删除文档
db.COLLECTION_NAME.remove(DELECTION_CRITERIA)
>db.shiyanlou.remove({"name":"Bob"})
查询:
find()用法:
db.COLLECTION_NAME.find() >use post >db.post.insert([ ..... ..... ]) >db.post.find() #查询所有记录 >db.post.find().pretty() #pretty()可以使查询输出的结果更美观
如果你想让 mongo shell 始终以 pretty 的方式显示返回数据,可以通过下面的指令实现:
echo "DBQuery.prototype._prettyShell = true" >> ~/.mongorc.js
多条件查询:
and: 当 find() 中传入多个键值对时,MongoDB 就会将其作为 AND 查询处理
>db.mycol.find({key1:value1,key2:value2}).pretty() or: >db.post.find( { $or:[ {key1: value1},{key2: value2} ] } ).pretty()
同时使用and,or:
> db.post.find({ "likes": {$gt:10}, $or: [ {"by": "shiyanlou"}, {"title": "MongoDB Overview"} ] }).pretty()
模糊查询:
{"name":/^start/}
{"name":/tail^/}
#########################
高级查询:聚合,索引
#########################
条件操作符:
gt:>
lt:<
gte:>=
lte:<=
=====================================================================
$type[key]
可选的 key 值如下:
1: 双精度型(Double)
2: 字符串(String)
3: 对象(Object)
4: 数组(Array)
5: 二进制数据(Binary data)
7: 对象ID(Object id)
8: 布尔类型(Boolean)
9: 数据(Date)
10: 空(Null)
11: 正则表达式(Regular Expression)
13: JS代码(Javascript)
14: 符号(Symbol)
15: 有作用域的JS代码(JavaScript with scope)
16: 32位整型数(32-bit integer)
17: 时间戳(Timestamp)
18: 64位整型数(64-bit integer)
-1: 最小值(Min key)
127: 最大值(Max key)
>db.shiyanlou.find({"name":{$type:2}}) #查找 name 是字符串的文档记录 >db.shiyanlou.find({"name":{$type:'string'}}) #和上面的效果相同
======================================================================
limit和skip
limit:读取指定数量的数据记录
>db.shiyanlou.find().limit(1) #读取一条记录,默认第一条
skip:读取时跳过指定数量的数据记录
>db.shiyanlou.find().limit(1).skip(1)
=========================================
排序sort,升序用1表示,降序用-1表示
>db.shiyanlou.find().sort({"time":1})
=========================================
索引:
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库集合中一个文档或多个文档的值进行排序的一种结构
db.COLLECTION_NAME.ensureIndex({KEY:1|-1}) >db.shiyanlou.ensureIndex({"name":1})
可选参数:
background Boolean 建立索引要不要阻塞其他数据库操作,默认false
unique Boolean 建立的索引是否唯一,默认false
name string 索引的名称,若未指定,系统自动生成
dropDups Boolean 建立唯一索引时,是否删除重复记录,默认false
sparse Boolean 对文档不存在的字段数据不启动索引,默认false
expireAfterSeconds Boolean 设置集合的生存时间,单位为秒
v index version
weights document 1-99999
default-language string 默认为英语
language_override string 默认为language
> db.shiyanlou.ensureIndex({"user_id":1,"name":1},{background:1})
聚合aggregate():
db.COLLECTION_NAME.aggregate({ $match:{x:1}, {limit:NUM}, $group:{_id:$age} })
可选参数:
$match:查询,跟 find 一样;
$limit:限制显示结果数量;
$skip:忽略结果数量;
$sort:排序;
$group:按照给定表达式组合结果
聚合表达式:
$sum,$avg,$min,$max,
$push #在结果文档中插入值到一个数组
$addToSet #在结果文档中插入值到一个数组,但不创建副本
$first #根据资源文档的排序获取第一个文档数据
$last #根据资源文档的排序获取最后一个文档数据
管道:
MongoDB 的聚合管道将 MongoDB 文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。 聚合框架中常用的几个操作:
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match 使用 MongoDB 的标准查询操作。
$limit:用来限制 MongoDB 聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
> db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"user",count:{$sum:1}}}])
{"_id":"user","count":2}
文档逻辑关系:
{user doc}
{address doc}
1.嵌入式关系(适合一对一关系)
{user doc
[{address doc}]
}
2.引用关系:将两个文档分开,通过引用文档的_id字段来建立关系(适合一对多,多对多)
{user doc
"address_ids":[
ObjectId("448664345476436400000")
]#对应address doc id
}
集合:
集合就是一组文档的组合,就相当于是关系数据库中的表,在MongoDB中可以存储不同的文档结构的文档
{"company":"Chneshi keji"}{"people":"man","name":"peter"}
元数据:
数据库的信息存储在集合中,他们统一使用系统的命名空间:DBNAME.system.* DBNAME 可用 db 或数据库名替代
DBNAME.system.namespaces :列出所有名字空间
DBNAME.system.indexs :列出所有索引
DBNAME.system.profile :列出数据库概要信息
DBNAME.system.users :列出访问数据库的用户
DBNAME.system.sources :列出服务器信息