mongo.confjavascript
dbpath=/Users/**/Documents/**/mongodb/data
port=3000
复制代码
命令行输入java
mongod --config mongo.conf
复制代码
命令行输入git
mongo --port 3000
复制代码
mongoimport
mongoexport
参数 | 含义 |
---|---|
-h [ --host ] | 链接的数据库 |
--port | 端口号 |
-u | 用户名 |
-p | 密码 |
-d | 导出的数据库 |
-c | 指定导出的集合 |
-o | 导出的文件存储路径 |
-q | 进行过滤 |
数据库实例
school
下的grade1
集合mongodb
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abd6"), "name" : "Lucy_1", "age" : 1 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abd7"), "name" : "Lucy_2", "age" : 2 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abd8"), "name" : "Lucy_3", "age" : 3 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abd9"), "name" : "Lucy_4", "age" : 4 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abda"), "name" : "Lucy_5", "age" : 5 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abdb"), "name" : "Lucy_6", "age" : 6 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abdc"), "name" : "Lucy_7", "age" : 7 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abdd"), "name" : "Lucy_8", "age" : 8 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abde"), "name" : "Lucy_9", "age" : 9 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abdf"), "name" : "Lucy_10", "age" : 10 }
复制代码
将
127.0.0.1
host下的3000
端口的school
数据库下的grade1
集合中的数据导出到students.bak
文件下数据库
$ mongoexport -h 127.0.0.1 --port 3000 -d school -c grade1 -o students.bak
// 2018-05-03T21:20:17.838+0800 connected to: 127.0.0.1:3000
// 2018-05-03T21:20:17.844+0800 exported 10 records
复制代码
db.grade1.remove({})
// WriteResult({ "nRemoved" : 10 })
复制代码
db.grade1.count()
//0
复制代码
$ mongoimport -h 127.0.0.1 --port 3000 -d school -c grade1 --file students.bak
// 2018-05-03T21:33:20.503+0800 connected to: 127.0.0.1:3000
// 2018-05-03T21:33:20.512+0800 imported 10 documents
复制代码
db.grade1.find({})
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abd6"), "name" : "Lucy_1", "age" : 1 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abd9"), "name" : "Lucy_4", "age" : 4 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abd7"), "name" : "Lucy_2", "age" : 2 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abd8"), "name" : "Lucy_3", "age" : 3 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abda"), "name" : "Lucy_5", "age" : 5 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abdc"), "name" : "Lucy_7", "age" : 7 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abdb"), "name" : "Lucy_6", "age" : 6 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abdd"), "name" : "Lucy_8", "age" : 8 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abde"), "name" : "Lucy_9", "age" : 9 }
{ "_id" : ObjectId("5aeb05dc6cebbe7c6012abdf"), "name" : "Lucy_10", "age" : 10 }
复制代码
备份(
mongodump
) + 恢复(mongorestore
)json
在Mongodb中咱们使用mongodump命令来备份MongoDB数据。该命令能够导出全部数据到指定目录中。数组
mongodump -h dbhost -d dbname -o dbdirectory
复制代码
-h
MongDB所在服务器地址,例如:127.0.0.1,固然也能够指定端口号:127.0.0.1:27017-d
须要备份的数据库实例,例如:test-o
备份的数据存放位置mongodb使用 mongorestore 命令来恢复备份的数据。bash
mongorestore -h dbhost --port 3000 data.bmp
复制代码
mongorestore -h dbhost --port 3000 data.bmp/dbname
复制代码
--host
MongoDB所在服务器地址-d
须要恢复的数据库实例mongodump -h 127.0.0.1 --port 3000 -d school -o data.dmp
/* 2018-05-04T23:56:37.693+0800 writing school.grade3 to 2018-05-04T23:56:37.694+0800 writing school.grade1 to 2018-05-04T23:56:37.695+0800 writing school.grade2 to 2018-05-04T23:56:37.696+0800 done dumping school.grade3 (0 documents) 2018-05-04T23:56:37.697+0800 done dumping school.grade1 (9 documents) 2018-05-04T23:56:37.697+0800 done dumping school.grade2 (0 documents) */
复制代码
db.grade1.remove({})
// WriteResult({ "nRemoved" : 10 })
复制代码
db.grade1.count()
//0
复制代码
$ mongorestore -h 127.0.0.1 --port 3000 data.dmp
/* 2018-05-05T00:07:25.936+0800 preparing collections to restore from 2018-05-05T00:07:25.937+0800 reading metadata for school.grade1 from data.dmp/school/grade1.metadata.json 2018-05-05T00:07:25.937+0800 reading metadata for school.grade2 from data.dmp/school/grade2.metadata.json 2018-05-05T00:07:25.937+0800 reading metadata for school.grade3 from data.dmp/school/grade3.metadata.json 2018-05-05T00:07:25.937+0800 restoring school.grade1 from data.dmp/school/grade1.bson 2018-05-05T00:07:25.938+0800 restoring school.grade3 from data.dmp/school/grade3.bson 2018-05-05T00:07:25.938+0800 restoring school.grade2 from data.dmp/school/grade2.bson 2018-05-05T00:07:25.939+0800 no indexes to restore 2018-05-05T00:07:25.939+0800 finished restoring school.grade2 (0 documents) 2018-05-05T00:07:25.939+0800 no indexes to restore 2018-05-05T00:07:25.939+0800 finished restoring school.grade3 (0 documents) 2018-05-05T00:07:25.940+0800 no indexes to restore 2018-05-05T00:07:25.940+0800 finished restoring school.grade1 (10 documents) 2018-05-05T00:07:25.940+0800 done */
复制代码
最暴力最原始的方法,那就是直接拷贝~服务器
为了数据的完整性和一致性,导出前要先锁定写入,导出后再解锁。app
> use admin;
switched to db admin
// 锁定
> db.runCommand({fsync:1,lock:1});
/*{ "info" : "now locked against writes, use db.fsyncUnlock() to unlock", "lockCount" : NumberLong(1), "seeAlso" : "http://dochub.mongodb.org/core/fsynccommand", "ok" : 1 }*/
// 已经被锁定 写入操做不能执行
> db.grade1.insert({name:'Lucy_3', age: 3})
// 没有结果,等待中
// 解锁
> db.fsyncUnlock()
//{ "info" : "fsyncUnlock completed", "lockCount" : NumberLong(0), "ok" : 1 }
// 解锁后能够正常进行写入操做
> db.grade1.insert({name:'Lucy_3', age: 3})
// WriteResult({ "nInserted" : 1 })
复制代码
show roles
/* { "role" : "dbAdmin", "db" : "school", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] } { "role" : "dbOwner", "db" : "school", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] } { "role" : "enableSharding", "db" : "school", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] } { "role" : "read", "db" : "school", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] } { "role" : "readWrite", "db" : "school", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] } { "role" : "userAdmin", "db" : "school", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ] } */
复制代码
> db.createUser({user:'mytest', pwd:'123', roles:[{role:'readWrite', db: 'school'}, 'read']})
/* 添加一个 Successfully added user: { "user" : "mytest", "roles" : [// 用户的权限配置 { "role" : "readWrite", "db" : "school" }, "read" ] }*/
复制代码
> db.runCommand({usersInfo:'mytest', showPrivileges: true})
/*{ "users" : [ { "_id" : "school.mytest", "user" : "mytest", "db" : "school", "roles" : [ { "role" : "readWrite", "db" : "school" }, { "role" : "read", "db" : "school" } ], "inheritedRoles" : [ { "role" : "read", "db" : "school" }, { "role" : "readWrite", "db" : "school" } ], "inheritedPrivileges" : [ ... ] } ], "ok" : 1 }*/
复制代码
添加了一个用户以后,再从新启动mongodb服务器并添加权限
// 添加--auth 参数
mongod --dbpath=./data --auth
复制代码
db.auth(username, password)
或者db.auth({ user: username, pwd: password })
> db.auth('mytest', '123');
/* 验证经过时: 1 */
/* 验证不经过时: Error: Authentication failed. 0 */
复制代码
db.changeUserPassword(username, password)
> db.changeUserPassword('mytest', '456')
> db.auth('mytest', '456')
// 1
复制代码
> db.runCommand({updateUser:'mytest', pwd: '456',customData:{name:'测试'}})
// { "ok" : 1 }
复制代码
添加的用户信息能够经过runCommand({usersInfo: 'mytest', showPrivileges: true})
命令查看。
distinct
在单个集合中查找指定字段的不一样值,即不重复的值。返回一个数组,数组包含的是不一样的值。
{
distinct: "<collection>",
key: "<field>",
query: <query>,
readConcern: <read concern document>,
collation: <collation document>
}
复制代码
// 原始数据
{ "_id" : ObjectId("5af416dd7d5233c02aeb0058"), "name" : "Tom1", "age" : 2, "province" : "山东", "city" : "德州" }
{ "_id" : ObjectId("5af416dd7d5233c02aeb0059"), "name" : "Tom2", "age" : 3, "province" : "山东", "city" : "青岛" }
{ "_id" : ObjectId("5af416dd7d5233c02aeb005a"), "name" : "Tom3", "age" : 3, "province" : "北京", "city" : "北京" }
{ "_id" : ObjectId("5af416dd7d5233c02aeb005b"), "name" : "Tom4", "age" : 2, "province" : "山西", "city" : "大同" }
{ "_id" : ObjectId("5af416dd7d5233c02aeb005c"), "name" : "Tom5", "age" : 1, "province" : "安徽", "city" : "合肥" }
{ "_id" : ObjectId("5af416dd7d5233c02aeb005d"), "name" : "Tom6", "age" : 3, "province" : "安徽", "city" : "合肥" }
复制代码
// 对 ‘grade2’集合进行操做,筛选条件为 age > 2
> db.runCommand({distinct: 'grade2', key: 'province', query: {age: {$gt: 2}}})
// { "values" : [ "山东", "北京", "安徽" ], "ok" : 1 }
复制代码
group
分组db.runCommand({
group:{
ns:集合名称,
key:分组的键,
initial:初始值,
$reduce:分解器
query:条件,
finalize:完成时的处理器
}
});
复制代码
// 原始数据
{ "_id" : ObjectId("5af416dd7d5233c02aeb0058"), "name" : "Tom1", "age" : 2, "province" : "山东", "city" : "德州" }
{ "_id" : ObjectId("5af416dd7d5233c02aeb0059"), "name" : "Tom2", "age" : 3, "province" : "山东", "city" : "青岛" }
{ "_id" : ObjectId("5af416dd7d5233c02aeb005a"), "name" : "Tom3", "age" : 3, "province" : "北京", "city" : "北京" }
{ "_id" : ObjectId("5af416dd7d5233c02aeb005b"), "name" : "Tom4", "age" : 2, "province" : "山西", "city" : "大同" }
{ "_id" : ObjectId("5af416dd7d5233c02aeb005c"), "name" : "Tom5", "age" : 1, "province" : "安徽", "city" : "合肥" }
{ "_id" : ObjectId("5af416dd7d5233c02aeb005d"), "name" : "Tom6", "age" : 3, "province" : "安徽", "city" : "合肥" }
复制代码
age > 1
)db.runCommand({
group: {
ns: 'grade2',
key: {
province: 1
},
initial: {
total: 0
},
$reduce: function(doc, result) {
result.total += doc.age;
},
query: {
age: {
$gt: 1
}
},
finalize: function(result) {
result.output = '年龄总和为: ' + result.total
}
}
})
// 运行结果为:共处理 5(count)条数据,分为 4 组
{
"retval" : [
{
"province" : "山东",
"total" : 5,
"output" : "年龄总和为: 5"
},
{
"province" : "北京",
"total" : 3,
"output" : "年龄总和为: 3"
},
{
"province" : "山西",
"total" : 2,
"output" : "年龄总和为: 2"
},
{
"province" : "安徽",
"total" : 3,
"output" : "年龄总和为: 3"
}
],
"count" : NumberLong(5),
"keys" : NumberLong(4),
"ok" : 1
}
复制代码
age > 1
)// 运行命令
db.runCommand({
group: {
ns: 'grade2',
key: {
province: 1,
city: 1
},
initial: {
total: 0
},
$reduce: function(doc, result) {
result.total += doc.age;
},
query: {
age: {
$gt: 1
}
}
}
})
// 运行结果为:共处理 5 条数据,分为 5 组
{
"retval" : [
{
"province" : "山东",
"city" : "德州",
"total" : 2
},
{
"province" : "山东",
"city" : "青岛",
"total" : 3
},
{
"province" : "北京",
"city" : "北京",
"total" : 3
},
{
"province" : "山西",
"city" : "大同",
"total" : 2
},
{
"province" : "安徽",
"city" : "合肥",
"total" : 3
}
],
"count" : NumberLong(5),
"keys" : NumberLong(5),
"ok" : 1
}
复制代码
drop
删除集合db.runCommand({
drop: 集合名称
})
复制代码
> show collections
/* grade1 grade2 grade3 */
// 删除 grade3 集合
> db.runCommand({drop: 'grade3'})
// { "ns" : "school.grade3", "nIndexesWas" : 1, "ok" : 1 }
> show collections
/*grade1 grade2*/
复制代码
db.runCommand()
经常使用命令buildInfo
- 返回当前mongd 的构建摘要> db.runCommand({buildInfo: 1})
/*{ "version" : "3.4.7", "gitVersion" : "cf38c1b8a0a8dca4a11737581beafef4fe120bcd", "modules" : [ ], "allocator" : "system", "javascriptEngine" : "mozjs", ... "ok" : 1 }*/
复制代码
getLastError
- 获取前一次的错误信息> db.grade1.insert({name: 'Lucy_4', age: 4, _id: 1})
//WriteResult({ "nInserted" : 1 })
> db.grade1.insert({name: 'Lucy_4', age: 4, _id: 1})
/* 报错: WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "E11000 duplicate key error collection: school.grade1 index: _id_ dup key: { : 1.0 }" } })*/
> db.runCommand({getLastError: 'school'})
/* 捕获到前一次的错误信息 { "connectionId" : 1, "err" : "E11000 duplicate key error collection: school.grade1 index: _id_ dup key: { : 1.0 }", "code" : 11000, "codeName" : "DuplicateKey", "n" : 0, "ok" : 1 }*/
>
复制代码
MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,咱们能够想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部元素。
形状以下图:
db.createCollection('logs', {
size: 5, // 整个集合空间大小,单位为【KB】
max: 3, // 集合文档个数上线,单位是【个】
capped: true // 设置为true, 表示建立的是固定集合
})
复制代码
> db.logs.insert([{time: 1}, {time: 2}, {time: 3}, {time: 4}])
> db.logs.find({})
/* { "_id" : ObjectId("5af441247d5233c02aeb0061"), "time" : 2 } { "_id" : ObjectId("5af441617d5233c02aeb0062"), "time" : 3 } { "_id" : ObjectId("5af441687d5233c02aeb0063"), "time" : 4 } */
复制代码
db.logs.isCapped()
> db.logs.isCapped()
// true
> db.grade1.isCapped()
// false
复制代码
db.runCommand({convertToCapped: 'logs', size: 6})
// { "ok" : 1 }
复制代码
put
mongofiles -d dbname put 文件名
复制代码
> mongofiles --port 3000 -d myfiles put 1.txt
/* 2018-05-10T21:14:50.170+0800 connected to: localhost:3000 added file: 1.txt */
// 会生成两个集合
> show collections
/* fs.chunks fs.files */
// fs.files 存储的doc
{
"_id" : ObjectId("5af445cac3666e928f286c5a"),
"chunkSize" : 261120,
"uploadDate" : ISODate("2018-05-10T13:14:50.203Z"),
"length" : 12,
"md5" : "a2ef74a76b2bfcfe14817a27c511759c",
"filename" : "1.txt"
}
// fs.chunks 存储的 doc
{
"_id" : ObjectId("5af445cac3666e928f286c5b"),
"files_id" : ObjectId("5af445cac3666e928f286c5a"),
"n" : 0,
"data" : { "$binary" : "MTIzCjQ1Ngo3ODkK", "$type" : "00" }
}
复制代码
// (bigFile.zip 大小为 85.6MB)
> mongofiles --port 3000 -d myfiles put bigFile.zip
/* 2018-05-10T21:29:23.425+0800 connected to: localhost:3000 added file: bigFile.zip */
// 1.txt 和 bigFile.zip 总共占用了 333 个网格
> db.fs.chunks.count()
333
复制代码
get
> mongofiles --port 3000 -d myfiles get 1.txt
/* 2018-05-10T21:36:24.889+0800 connected to: localhost:3000 finished writing to 1.txt */
复制代码
list
> mongofiles --port 3000 -d myfiles list
/* 2018-05-10T21:37:21.424+0800 connected to: localhost:3000 1.txt 12 bigFile.zip 86493501 */
复制代码
delete
> mongofiles --port 3000 -d myfiles delete 1.txt
/* 2018-05-10T21:38:42.324+0800 connected to: localhost:3000 successfully deleted all instances of '1.txt' from GridFS */
复制代码
// 执行JS语句
> db.eval("return 'hello'");
WARNING: db.eval is deprecated
hello
// 定义JS全局变量
> db.system.js.insert({_id:'myname', value: 'Lily'})
// WriteResult({ "nInserted" : 1 })
> db.eval("return myname");
/* WARNING: db.eval is deprecated Lily */
// 定义函数
> db.system.js.insert({_id:'sayHello', value: function(){return 'hello'}})
// WriteResult({ "nInserted" : 1 })
> db.eval("sayHello()");
/* WARNING: db.eval is deprecated hello */
复制代码
定义的函数在客户端的显示以下图: