跳至主要內容

MongoDB

naijoug大约 3 分钟

reference

SQL VS MongoDB

SQL术语/概念MongoDB术语/概念
database(数据库)database(数据库)
table(表)collection(集合)
row(行)document(文档)
column(字段)field(域)
index (索引)index(索引)
table joins(表连接)不支持
primary key(主键)primary key(MongoDB自动将_id字段设置为主键)

usage

# 服务端启动
$ mongod    # 启动 mongo 服务,默认数据库目录"/data/db"
$ mongod --dbpath=/path     # 指定数据库目录
$ mongod --port 20111       # 指定端口号(默认服务端口号 : 27017)
$ mongod --rest             # 启用 HTTP 的用户页面(页面端口号 : 28017)
$ mongod --fork --logpath=/logpath --logappend=true
#   --fork      用于将 mongo 服务挂到 init 进程(pid=1)下启动
#               防止非 exit 退出命令行,出现错误 `got signal 1 (Hangup), will terminate after current cmd ends`
#   --logpath       指定 mongo 日志文件,注意是指定文件不是目录
#   --logappend     使用追加的方式写日志
$ mongod -f /path/file.conf # 通过配置文件启动,conf 中设置启动参数

# 客户端启动
$ ./mongo     # 进入 mongo 后台管理

# 关闭 MongoDB
#  方案一 : mongo 命令
> use admin
> db.shutdownServer()
#  方案二 : kill mongo 进程
  • ubuntu
# 默认 path
#   config : /etc/mongod.conf
#   dbpath : /var/lib/mongodb
#   logpath : /var/log/mongodb
$ sudo service mongod start
$ sudo service mongod stop
$ sudo service mongod restart

$ systemctl start mongod
$ systemctl stop mongod
$ systemctl status mongod
$ systemctl restart mongod
$ systemctl enable mongod   # 重启自动启动 mongo

$ tail -n 100 /var/log/mongodb/mongod.log # 查看 mongo 日志
  • brew
# config: /usr/local/etc/mongod.conf
# logpath: /usr/local/var/log/mongodb
# dbpath: /usr/local/var/mongodb

$ brew services restart mongodb
$ brew services stop mongodb
$ brew services start mongodb

Commands

  • 常用命令
> show users                # 显示所有用户
> show dbs                  # 显示所有数据库
> db                        # 显示当前所在数据库
> use Users                 # 切换到 Users 数据库
> show collections;         # 显示当前数据库中的表列表
> help                      # 显示帮助信息
> db.help();                # 显示 db 帮助信息
> db.Users.help();          # 显示 Users 表帮助信息 
> db.auth("user", "pwd")    # 用户授权  
  • 用户授权
# 用户授权
> use reporting
> db.grantRolesToUser(
   "reportsUser",
   [
     { role: "readWrite", db: "products" } ,
     { role: "readAnyDatabase", db:"admin" }
   ]
 )
# 撤销用户授权
> use reporting
> db.revokeRolesFromUser(
    "reportsUser",
    [
      { role: "readWrite", db: "accounts" }
    ]
 )
  • 数据库(创建 & 删除)
# 创建数据库
> use User  # 存在,切换到User数据库;不存在,创建(刚创建的数据库,需要插入一条数据后,才能显示)
# 删除数据库
> db.dropDatabase() # 需要先切换到对应数据库
# 创建Info数据库,并创建数据访问用户,有读写权限
> use Info
# 3.0添加用户
> db.createUser({user:"admin", pwd:"admin", roles:["readWrite"]})
# 2.0添加用户
> db.addUser("admin","123456",false) # 最后参数:是否只读
  • 集合数据(增 & 删 & 改 & 查)
# 插入数据
> db.User.insert({"id","0001", "name":"kobe", "age":24}) # User是插入的集合名
> db.User.save({"id":"0002", "name":"James", "age":23})  # 不传_id,等价于insert
# 删除数据
> db.User.remove({"age":24})        # 删除所有age=24的文档
> db.User.remove({"age":24}, true)  # 删除一条age=24的文档
> db.User.remove({})                # 清空User文档
# 修改数据
> db.User.update({"id":"0001"}, {$set : {"name":"James", "age":23}})  # 前面查询条件,后面更新数据,仅更新第一条
> db.User.update({"name":"kobe"}, {$set : {"age":"24"}}, {multi:true}) # 更新所有符合条件数据
> db.User.save({"_id":ObjectId("584e56b8889783db5c067282"), "age":24}); # 修改_id的数据
# 查询数据
> db.User.find()            # 查询User集合数据
> db.User.find().pretty()   # 易读形式查询User集合数据
> db.User.findOne()         # 返回一个文档
# 条件查询
# AND 条件查询 (name=kobe && 12< age && age < 24 )
> db.User.find({"name":"kobe", "age":{$gt:12, $lt:24}})     
# OR 条件查询 (id=0001 or age > 24)
> db.User.find({$or : [{"id":"0001"}, {"age":{$gt:24}}]})  
# AND 和 OR 联合使用 (age=kobe or age < 24)
> db.User.find({"name":"kobe", $or : [{"age":{$lt:24}}]})   
# $lt : < | $lte : <= | $gt : > | $gte : >= | $ne : !=
# 模糊查询
> db.User.find({"name":{$regex:"110"}}) # 查询名字中包含 110 的
# 指定返回字段, 1 -> 返回 ; 0 -> 不返回
> db.User.find({"name":"kobe"},{"_id":0,"age":1}) 
> db.User.find().count()    # 结果集总数
> db.User.find().skip(2)    # 跳过前两条数据
> db.User.find().limit(5)   # 限制条数 
  • 数据库迁移
# mongodump

# mongorestore

Error

$ [sudo] chown mongodb.mongodb -R /var/lib/mongodb