以mac osx为例
/Users/qiudeqing/Desktop/tools/mongodb-osx-x86_64-3.4.1
~/.bashrc
后添加PATH=$PATH:/Users/qiudeqing/Desktop/tools/mongodb-osx-x86_64-3.4.1/bin
创建数据目录: 第一次运行MongoDB之前需要创建保存数据的数据目录, 默认使用/data/db
, 运行以下命令创建目录:
mkdir -p /data/db
mongod
命令之前需要确保当前用户对数据目录的读写权限运行MongoDB: 执行mongod --dbpath <path to data directory>
运行mongodb将数据保存到指定目录, 如果使用系统默认目录, 不需要后面参数
mongod -dbpath /Users/qiudeqing/Desktop/tools/data/db
命令mongo
默认连接数据库
show dbs
: 显示所有数据库列表db
: 显示当前数据库对象use <db name>
: 切换数据库, 如果数据库不存在会自动创建以下数据库是保留的:
下表是RDMS与MongoDB对应术语
RDBMS | MongoDB |
---|---|
数据库 | 数据库 |
表 | 集合 |
行 | 文档 |
列 | 字段 |
表join | 嵌入文档 |
主键 | 主键(MongoDB提供_id) |
客户端和服务器
MySQL | MongoDB |
---|---|
mysqld | mongod |
mysql | mongo |
use <database name>
如果数据库不存在, 则创建数据库, 否则切换到该数据库
没有内容的数据库不会出现在数据库列表中. 向其中插入数据:
db.runoob.insert({"name": "hello"})
db.dropDatabase()
删除当前数据库
集合类型RDBMS的表. 集合存在于数据库中, 没有固定的结构, 意味着可以对集合插入不同格式和类型的数据, 单通常情况下插入集合的数据都有一定关联性
第一个文档插入时, 集合就会被创建.
合法的集合名:
""
\0
system
开头, 这是为系统集合保留的前缀db.<collection name>.drop()
Capped collections就是固定大小的collection, 有很高的性能以及队列过期的特性(过期按照插入的顺序).
文档是一个键值(key-value)对(BSON). MongoDB的文档不需要设置相同的字段, 并且相同的字段不需要相同的数据类型.
注意:
文档键命名规范:
\0
(空字符), 这个字符用来表示键的结尾.
和$
有特别意义, 只有在特定环境下才使用_
的键是保留的MongoDB使用insert()或save()想集合中插入文档
db.<collection name>.insert(document)
示例
db.col.insert({
title: 'mongodb tutorial',
description: 'mongodb教程',
tags: ['mongodb', 'database', 'nosql'],
likes: 100
})
也可以使用save命令插入文档. 如果插入的document没有_id
字段. save方法类似于insert, 如果指定了_id
, 执行更新操作
db.<collection name>.save(document)
MongoDB使用update()和save()方法更新集合中的文档
update()方法用于更新已存在的文档:
db.<collection name>.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
query
:update的查询条件update
: update的对象和一些更新的操作符upsert
: 可选, 如果不存在update的记录, 是否插入newObje, true插入, false(默认值)不插入multi
: 可选, 默认false, 是否更新所有查询到的记录, false时只更新找到的第一条writeConcern
: 可选, 抛出异常的级别下面的命令更新一个文档title字段
db.col.update({
title: 'mongodb tutorial'
}, {
$set: {
title: 'mongoDB教程'
}
})
save()通过传入的文档替换文档
db.<collection name>.save(
<document>,
{
writeConcern: <document>
}
)
以下命令替换_id为585e37516f14d409aeb51d79的文档
db.col.save({
_id: ObjectId("585e37516f14d409aeb51d79"),
"title": "MongoDB 教程(更新)",
"description": "MongoDB是一个NoSQL数据库",
"by": "runnoob",
"tags": [
"mongodb",
"NoSQL"
]
})
remove()删除集合中的文档, 在执行remove()函数前执行find()判断执行条件是否正确, 是一个好习惯. 语法如下:
db.<collection name>.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
与SQL对比
操作 | 格式 | 例子 | RDBMS对比 |
---|---|---|---|
等于 | {<key>: <value>} |
db.col.find({by: 'qiu'}) |
where by = 'qiu' |
小于 | {<key>: { $lt: <value>}} |
db.col.find({likes: {$lt: 50}}) |
where like < 50 |
小于或等于 | {<key>: { $lte: <value>}} |
db.col.find({likes: {$lte: 50}}) |
where likes <= 50 |
大于 | {<key>: { $gt: <value>}} |
db.col.find({likes: {$gt: 50}}) |
where likes > 50 |
大于或等于 | {<key>: { $gte: <value>}} |
db.col.find({likes: {$gte: 50}}) |
where likes >= 50 |
不等于 | {<key>: { $ne: <value>}} |
db.col.find({likes: {$ne: 50}}) |
where likes != 50 |
逻辑运算and: 在查询对象中添加多个键自动执行and
逻辑运算or: 使用$or
执行or运算
db.<collection name>.find({
$or: [
{key1: value1},
{key2: value2}
]
})
以下代码查询查询标题为MongoDB 教程(更新)或者likes等于100的文档
db.col.find({
$or: [
{
title: 'MongoDB 教程(更新)'
},
{
likes: 100
}
]
})
以下例子联合AND和OR查询. 类似SQL: where likes > 50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程(更新)')
db.col.find({
likes: {
$gt: 50
},
$or: [
{
by: '菜鸟教程'
},
{
title: 'MongoDB 教程(更新)'
}
]
})
创建索引语法如下:
db.<collection name>.ensureIndex({
<key>: <sortRule>
})
聚合主要用于处理数据, 如平均值, 求和等, 详细内容参考mongodb aggregate
db.<collection name>.aggregate(AGGREGATE_OPERATION)
数据库信息存储在集合中, 使用系统命名空间
dbname.system.*
在MongoDB数据库中名字空间<dbname>.system.*
是包含多种系统信息的特殊集合, 如:
集合命名空间 | 描述 |
---|---|
dbname.system.namespaces | 列出所有名字空间 |
dbname.system.indexes | 列出所有索引 |
dbname.system.profile | 包含数据库概要信息 |
dbname.system.users | 列出所有可访问数据库的用户 |
数据类型 | 描述 |
---|---|
String | 字符串.存储数据常用的数据类型, UTF-8编码字符串才是合法的 |
Integer | 整型. 用于存储数值, 根据服务器分为32位或64位 |
Boolean | 布尔值. 存储真假 |
Double | 双精度浮点值 |
min/Max keys | 将一个值与BSON元素的最低值和最高值对比 |
Arrays | 用于将数组或列表或多个值存储为一个键 |
Timestamp | 时间戳. 记录文档修改或添加的具体时间 |
Object | 内嵌文档 |
Null | 创建空值 |
Symbol | 符号, 数据类型上等同于字符串. 不同在于它一般用于采用特殊符号类型的语言 |
Date | 日期时间, 用Unix事件格式从尺寸当前日期或时间, 可以指定自己的日期时间: 创建Date对象, 传入年月日信息 |
Object ID | 对象ID, 用于创建文档的ID |
Binary Data | 二进制数据.用于存储二进制数据 |
Code | 代码类型. 用于在文档中存储JavaScript代码 |
Regular Expression | 正则表达式 |
链接格式username:password@hostname/dbname