MongoDB

MongoDB

MongoDB是高性能(得益于内存缓存)、无模式的文档型数据库,支持二级索引,类json格式存储(bson),非常适合文档化格式的存储及查询。适合用来存放评论等半结构化数据;
MongoDB的官方定位是通用数据库,与MySQ类似,但跟传统关系型数据库比较,Mongo在事务、join、复杂查询应用下仍旧无法取代关系型数据库。

mongo shell

query

  • ObjectId: db.getCollection('activities').find(ObjectId('5a9f5e7137c65800015df8d0'))
  • AND: db.collection.find({ "key" : "value", "key1" : "value1"})
  • OR:
db.collection.find({    
$or : [
{k1:v1},
{k2:v2}
]
})

条件

  • lt, lte, gt, gte:
db.collection.find({
"key" : { $gte : 59}
})
  • not null : db.collection.find({"key": {$exists:true}})

排序

  • 升序: db.collection.find({}).sort({"key": 1})
  • 降序: db.collection.find({}).sort({"key": -1})

update

格式:

db.collection.update(
{query},
{update},
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)

例子:

db.getCollection('activities').update(
{"dateStart" : {$gte:1514736000000}},
{$set : {'name' : 'xxxx'}},
{multi : true}
)

inc自增:

db.getCollection('activities').update(
{ "_id" : ObjectId("5aa86f063dd35a000113401f") },
{ $inc : { "score" : 10 }}
)

数组操作

  • $push:向文档数组中添加元素,如果没有该数组,则自动添加数组
  • $addToSet:功能与$push相同,区别在于,$addToSet把数组看作成一个Set,如果数组中存在相同的元素,不会插入。$addToSet : {'displayAttributes' : 'totalPvShow'}

数组操作:

db.getCollection('activities').update(
{"dateStart" : {$gte:1514736000000}},
{$addToSet : {'displayAttributes' : 'totalPvShow'}},
{multi : true}
)

aggregate

设每个数据包括 { "icq": "xxx", "score1" : 1, "score2" : 2 }, 按icq聚合, 求score1score2的和

db.getCollection('item').aggregate([
{$match : { "icq" : "xxxx"} }, # 匹配条件
{$group : {
_id : "$icq" , # `_id`是固定的语法, 按哪一属性聚合
score1_sum : { $sum : "$score1" }, # 自定义结果名: {$操作 : "$属性名"}
score2_sum : { $sum : "$channel" }
}
}
])

mongo命令

启动数据库并开启权限: /opt/apps/mongodb/bin/mongod --config /opt/conf/mongo/mongo.conf --auth

连接mongo并查询

mongo 127.0.0.1 -u username -p pwd --port 28015 # 连接数据库
mongo 127.0.0.1 -u username -p pwd --port 28015 --authenticationDatabase "admin" # 指定验证的db
mongo 127.0.0.1:27017/admin -u mongouser -p pwd # 另一种登录格式


> show dbs # 列出所有数据库
> use db_name
> show collections # collection类似表
> db.collection_name.find() # 在xxx这个collection里查找
> db.collection_name.find({appid: "total", time: "20170324"}) # 在xxx里查找appid=total的项

关闭mongo服务:

> use admin
> db.shutdownServer();

mongoexport

  • mongoexport参数说明:

    • -d: database
    • /c: collection
    • /q: query filter, as a JSON string, e.g., ‘{x:{$gt:1}}’
    • /sort: sort order, as a JSON string, e.g. ‘{x:1}’
    • —-authenticationDatabase “admin” : 指定验证db
  • 将info库中student的id,name信息以json格式导出到student_json.dat数据文件中,并且限定“行数”是1

    • mongoexport -h 127.0.0.1 -u root -p 12345 -d info -c student --type=json -f id,name --limit=1 -o E:\data\student_json.dat
  • 将info库student collections的name=a的信息以cvs格式导出到student_cvs.dat数据文件中
    • mongoexport -h 127.0.0.1 -u root -p 12345 -d info -c student --type=cvs -q{"name":"a"} -o E:\data\student_cvs.dat

权限

  • 在admin数据库里addUser创建的是管理员用户, 可以访问任何数据库 db.addUser("admin","admin");
  • use DATABASE_NAME : 如果数据库不存在,则创建数据库,否则切换到指定数据库。
  • 在某个数据库里addUser创建的用户, 只有对这个数据库的权限
  • 创建用户: db.addUser(“user”,”pwd”);
  • 删除用户: db.removeUser(“xxx”);
  • 查找用户: db.system.users.find()

创建具有admin权限的用户:

> use admin
> db.addUser("admin","password")
{
"user" : "admin",
"readOnly" : false,
"pwd" : "a254f094f02d3c96f4748175cb4b9403",
"_id" : ObjectId("595afee766c59f7c02021c99")
}

如何使用创建的用户登录:

use admin # 授权admin必须切换到admin库
db.auth("admin","password")
use db_name # 切换到要查询的库
show collections