转载请注明出处: http://qiudeqing.com/tools/2016/12/24/mongodb.html

安装

以mac osx为例

  1. 前往mongodb下载页面选择所需版本, 解压到本机目录如/Users/qiudeqing/Desktop/tools/mongodb-osx-x86_64-3.4.1
  2. ~/.bashrc后添加PATH=$PATH:/Users/qiudeqing/Desktop/tools/mongodb-osx-x86_64-3.4.1/bin

运行

  1. 创建数据目录: 第一次运行MongoDB之前需要创建保存数据的数据目录, 默认使用/data/db, 运行以下命令创建目录:

     mkdir -p /data/db
    
  2. 设置数据目录权限: 运行mongod命令之前需要确保当前用户对数据目录的读写权限
  3. 运行MongoDB: 执行mongod --dbpath <path to data directory>运行mongodb将数据保存到指定目录, 如果使用系统默认目录, 不需要后面参数

     mongod -dbpath /Users/qiudeqing/Desktop/tools/data/db
    

连接

命令mongo默认连接数据库

数据库

以下数据库是保留的:

下表是RDMS与MongoDB对应术语

RDBMS MongoDB
数据库 数据库
集合
文档
字段
表join 嵌入文档
主键 主键(MongoDB提供_id)

客户端和服务器

MySQL MongoDB
mysqld mongod
mysql mongo

创建数据库

use <database name>

如果数据库不存在, 则创建数据库, 否则切换到该数据库

没有内容的数据库不会出现在数据库列表中. 向其中插入数据:

db.runoob.insert({"name": "hello"})

删除数据库

db.dropDatabase()

删除当前数据库

集合

集合类型RDBMS的表. 集合存在于数据库中, 没有固定的结构, 意味着可以对集合插入不同格式和类型的数据, 单通常情况下插入集合的数据都有一定关联性

第一个文档插入时, 集合就会被创建.

合法的集合名:

删除集合

db.<collection name>.drop()

capped collections

Capped collections就是固定大小的collection, 有很高的性能以及队列过期的特性(过期按照插入的顺序).

文档

文档是一个键值(key-value)对(BSON). MongoDB的文档不需要设置相同的字段, 并且相同的字段不需要相同的数据类型.

注意:

文档键命名规范:

插入文档

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>
    }
)

参数说明:

下面的命令更新一个文档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 正则表达式

链接到MongoDB服务器

链接格式username:password@hostname/dbname