Skip to content

mongodb 使用笔记

linux 下安装 mongodb

下载二进制文件后,终端输入:

bash
## 不使用配制文件启动
./bin/mongod -auth --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs --logappend --port=27017 --fork

补充

官方提供 deb 等二进制包,可以使用。

修改配制文件

修改 /etc/mongod.conf

bash
## mongod.conf

## for documentation of all options, see:
##   http://docs.mongodb.org/manual/reference/configuration-options/

## Where and how to store data.
storage:
  dbPath: /home/junlsoft/mongodb/data
  journal:
    enabled: true
##  engine:
##  mmapv1:
##  wiredTiger:

## where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /home/junlsoft/mongodb/logs

## network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0


## how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo
  fork: true

security:
  authorization: enabled

#operationProfiling:

#replication:

#sharding:

### Enterprise-Only Options:

#auditLog:

#snmp:

使用配置文件启动

bash
mongod --config /etc/mongod.conf

GUI 工具推荐

  1. robo3t(轻量,免费)
  2. 3t studio(重量,收费)
  3. dbKoda(重量,免费)

备份与恢复

利用 bin 下的 mongodumpmongorestore

备份

bash
[root@localhost bin]## ./mongodump -d my_mongodb
connected to: 127.0.0.1
DATABASE: my_mongodb     to     dump/my_mongodb
my_mongodb.system.indexes to dump/my_mongodb/system.indexes.bson
1 objects
my_mongodb.user to dump/my_mongodb/user.bson
2 objects
[root@localhost bin]## ll
总计 67648
-rwxr-xr-x 1 root root 7508756 2011-04-06 bsondump
drwxr-xr-x 3 root root    4096 04-10 23:54 dump
-rwxr-xr-x 1 root root 2978016 2011-04-06 mongo

恢复

bash
[root@localhost bin]## ./mongorestore -d my_mongodb my_mongodb_dump/
connected to: 127.0.0.1
Wed Apr 11 00:03:03 my_mongodb_dump/my_mongodb/user.bson
Wed Apr 11 00:03:03      going into namespace [my_mongodb.user]
Wed Apr 11 00:03:03      2 objects found
Wed Apr 11 00:03:03 my_mongodb_dump/my_mongodb/system.indexes.bson
Wed Apr 11 00:03:03      going into namespace [my_mongodb.system.indexes]
Wed Apr 11 00:03:03 { name: "_id_", ns: "my_mongodb.user", key: { _id: 1 }, v: 0 }
Wed Apr 11 00:03:03      1 objects found
[root@localhost bin]#

导出

bash
## -d:数据库名
## -c:集合名称
## -o : 导出数据文件的路径
## -type : 导出数据类型,默认json
mongoexport -d dbname -c collectionname -o filepath --type json/csv -f field

导入

bash
## -d:数据库名
## -c:集合名称
## --file : 选择导入的文件
## -type : 文件类型,默认json
## -f : 字段,type为csv是必须设置此项
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field

新建用户无法授权登录

千万不要相信 robo3t 自带的权限可视化操作,这是元凶。 千万不要相信 robo3t 自带的权限可视化操作,这是元凶。 千万不要相信 robo3t 自带的权限可视化操作,这是元凶。

根本原因是 mongodb 加入了 SCRAM-SHA-1 校验方式

删除原来的用户后用 shell 创建:

javascript
db.createUser({ user: "admin", pwd: "admin", roles: ["root"] });

登录 shell 可以用:

bash
mongo admin -u root -p 123456

复杂查询和数据聚合

普通查询这里不做阐述,看看文档很容易理解。这里主要讲一些高级查询。

用 $lookup 进行联合查询

例如

json
// member
{
  "_id": ObjectId("5b803abf3beda646c35c0504"),
  "name": "测试用户",
  "role": "admin",
  "sex": "男",
  "password": "0"
}
json
// project
{
    "projectName": "AAA",
    "createDate": "2018-08-25"
    "memberId": ObjectId("5b803abf3beda646c35c0504")
}

如果要查询 project 的时候带出 member 的数据

javascript
db.getCollection("project").aggregate([
  {
    $match: { projectName: projectName },
  },
  {
    $lookup: {
      from: "member",
      localField: "memberId",
      foreignField: "_id",
      as: "memberDetail",
    },
  },
]);

用 $sort 进行排序

javascript
db.getCollection('project').aggregate([
    {
        $match: { "projectName": projectName }
    },
    {
      $lookup: {
        from: "member",
        localField: "memberId",
        foreignField: "_id",
        as: "memberDetail"
      }
    },
    {
      $sort: { createDate: -1 }
    }
])

用 $limit 进行限制条数

javascript
db.getCollection('project').aggregate([
    {
        $match: { "projectName": projectName }
    },
    {
      $lookup: {
        from: "member",
        localField: "memberId",
        foreignField: "_id",
        as: "memberDetail"
      }
    },
    {
      $sort: { createDate: -1 }
    },
    {
      $limit: 10
    }
])

TIP

$limit 可以与 $skip 配合,达到分页查询的效果。

用 $unwind 扁平化数据

json
({
  "_id": ObjectId("5b803b0a3beda646c35c050b"),
  "projectName": "测试项目",
  "startTime": 0,
  "endTime": 0,
  "desc": "描述",
  "members": [ObjectId("5b803abf3beda646c35c0504"), ObjectId("5b803ef73beda646c35c05a6")]
},
{
  "_id": ObjectId("5b8041043beda646c35c0609"),
  "projectName": "测试项目2",
  "startTime": 0,
  "endTime": 0,
  "desc": "描述",
  "members": [ObjectId("5b803ef73beda646c35c05a6")]
})

扁平化处理:

javascript
db.getCollection("project").aggregate([
  {
    $unwind: "$members",
  },
]);

输出结果:

json
({
  "_id": ObjectId("5b803b0a3beda646c35c050b"),
  "projectName": "测试项目",
  "startTime": 0,
  "endTime": 0,
  "desc": "描述",
  "members": ObjectId("5b803abf3beda646c35c0504")
},
{
  "_id": ObjectId("5b803b0a3beda646c35c050b"),
  "projectName": "测试项目",
  "startTime": 0,
  "endTime": 0,
  "desc": "描述",
  "members": ObjectId("5b803ef73beda646c35c05a6")
},
{
  "_id": ObjectId("5b8041043beda646c35c0609"),
  "projectName": "测试项目2",
  "startTime": 0,
  "endTime": 0,
  "desc": "描述",
  "members": ObjectId("5b803ef73beda646c35c05a6")
})

复杂数据插入

插入到子集合

例如如下结构:

json
// project
{
  "projectName": "AAA",
  "createDate": "2018-08-25",
  "tags": ["tag1", "tag2"]
}

如果要插入一个 "tag3" 操作方式如下:

javascript
project.update(
  { projectName: "AAA" },
  {
    $addToSet: {
      tags: "tag3",
    },
  }
);

结果:

json
// project
{
  "projectName": "AAA",
  "createDate": "2018-08-25",
  "tags": ["tag1", "tag2", "tag3"]
}

插入到子集合的子集合

例如如下结构:

json
// project
{
  "projectName": "AAA",
  "createDate": "2018-08-25",
  "children": [
    {
      "name": "BBB",
      "children": ["A", "B"]
    }
  ]
}

如果要插入一个 "C" 操作方式如下:

javascript
project.update(
  { "children.name": "BBB" },
  {
    $addToSet: {
      "children.$.children": "C",
    },
  }
);

结果:

json
// project
{
  "projectName": "AAA",
  "createDate": "2018-08-25",
  "children": [
    {
      "name": "BBB",
      "children": ["A", "B", "C"]
    }
  ]
}

最后编辑时间:

Version 4.1 (framework-1.1.4)