mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-05-19 19:27:16 +00:00
26 KiB
26 KiB
一、MongoDB常用命令
1.数据库常用命令
show dbs # 查询数据库列表
use student # 该命令如果数据库不存在,将创建一个新的数据库,否则将返回现有的数据库。
db.dropDatabase() # 删除新的数据库
db.repairDatabase() # 整理数据库,不仅能整理碎片还可以回收磁盘空间,但是会产生锁,建议停服的时候做
db.getName() # 查看当前使用的数据库
db.version() # 当前db的版本
db.getMongo() # 查看当前db的链接机器地址
db.getPrevError() # 查询之前的错误信息
db.resetError() # 清除错误记录
db.help() # 查看数据库帮助文档
2.集合常用命令
show collections # 查看所有的集合
db.createCollection("student") # 创建一个集合
db.createCollection("log", {size: 20, capped:true, max: 100}); # 或者带参数创建固定集合
db.student # 使用集合
db.student.drop() # 删除当前集合
db.student.validate() # 验证集合是否有问题,验证集合内容
db.student.count() # 查询当前集合的数据条数
db.student.dataSize() # 查看集合数据大小
db.student.totalIndexSize() # 查看集合索引大小
db.student.storageSize() # 集合分配的空间大小,包括未使用的空间
db.student.totalSize() # 显示集合总大小,包括索引和数据的大小和分配空间的大小
db.student.getDB() # 显示当前集合所在的db
db.student.stats() # 显示当前集合的状态
db.student.getShardVersion() # 集合的分片版本信息
db.student.renameCollection("students"); # 集合重命名
db.printCollectionStats() # 显示当前db所有集合的状态信息
db.student.help() # 查看集合命令帮助文档
- 集合内存
在MongoDB中并不需要创建集合。 当插入一些文档 MongoDB 会自动创建集合。
capped: Boolean
(可选)如果为true,它启用上限集合。上限集合是一个固定大小的集合,当它达到其最大尺寸会自动覆盖最老的条目。
如果指定true,则还需要指定参数的大小
size: number (可选)指定的上限集合字节的最大尺寸。如果capped 是true,那么还需要指定这个字段
autoIndexID Boolean (可选)如果为true,自动创建索引_id字段。默认的值是 false
max number (可选)指定上限集合允许的最大文件数
DB.createCollection("student", { capped : true, size : 6142800, autoIndexId : true, max : 10000 })
DB.createCollection("student")
3. 文档常用命令
增
db.student.insert({name:"jay", age: 100})
如果我们不指定_id参数插入的文档,那么 MongoDB 将为文档分配一个唯一的ObjectId。_id 是12个字节十六进制数在一个集合的每个文档是唯一的。
0-3时间戳,4-6机器唯一标识的散列标识,7-8进程号PID,9-11计数器。前三个保证同一个机器不同进程产生的标识唯一,后一个保证同一个进程产生不同的标识。
简介说就是在分布式系统中可以在本机产生全局唯一id。
删
db.student.remove({name : "jay"},true); # true是只删除一条,默认是false全部删除
db.student.remove({name : "jay"});
改
db.student.save({name : "jay", age : 20}) # save如果数据库已经有这条数据,则会更新它;如果没有,则写入
db.student.update({name:"jay"},{$set:{age : 20, company: "google"}});
db.student.update({name:"jay"},{$set:{age : 20}},{multi:true}); # $set修改器;multi默认false,只更新找到的第一条记录
db.student.update({name:"jay"},{$unset:{company:1}}); # $unset用于取消字段,去掉文档中的某个字段
db.student.update({name:"jay"},{$inc: {age: 50}}); # $inc用于增加或减少数值
db.student.update({name:"jay"},{$push: {phone: {home:456789}}}); # $push用于把元素追加到数组中,如果字段不存在,会新增
db.student.update({name:"jay"},{$pushAll: {phone: [{home:456789} # $pushAll用于把元素追加到数组中,多个元素
db.student.update({name:"jay"},{$pull: {phone:{home: 456789} }}); # $pull删除数组中满足条件的元素
db.student.update({name:"jay"},{$addToSet: {phone: {home:456789}}}); # $addToSet类似于push,但是只有这个值不在数组中才会增加
db.student.update({name:"jay"},{$pop: {phone:1}}); # $pop删除数组中最后一个元素
db.student.update({name:"jay"},{$rename: {phone:"call"}}); # $rename修改字段名称
查
db.student.find()
db.student.find().pretty(); # 如果需要结构化显示返回的文档可以加上pretty()方法
db.student.find({name:"jay"},{age:1}) # 查询name伟jay,只显示age
db.student.count({$or: [{age: 14}, {age: 28}]}); # 查询满足条件的文档数量
4.索引
创建索引
db.student.ensureIndex({age: 1}); # 1表示age索引按升序排序
db.student.ensureIndex({name: 1, age: -1}); # -1表示同组文档按降序排序
例如我们有数据:
{"name":"jay",age:14}
{"name":"ad",age:14}
{"name":"ad",age:38}
{"name":"ad",age:24}
{"name":"ab",age:14}
使用db.student.ensureIndex({name: 1, age: -1})建议索引后,索引中的数据组织为:
{"name":"ab",age:14}
{"name":"ad",age:38}
{"name":"ad",age:24}
{"name":"ad",age:14}
{"name":"jay",age:14}
创建唯一索引
db.student.ensureIndex({name:1},{unique:true}) # 如果创建唯一索引时已经存在重复项,通过dropDups在创建唯一索引时消除重复文档
db.student.ensureIndex({name:1},{unique:true,dropDups:true})
索引操作
db.student.getIndexes(); # 查询集合所有索引
db.student.totalIndexSize(); # 查看集合总索引记录大小
db.student.reIndex(); # 修复索引
db.student.dropIndex("name");# 删除指定索引
索引调优explain
db.student.find({name: "jaysunxiao" }).explain();
5.查询
单个文档大小
Object.bsonsize(db.user.findOne({'account':'xxx'})) # 返回文档的bytes数量
迭代器,一般用于遍历数据集。通过hasNext()判断是否有下一条数据,next()获取下一条数据
var iterator= db.student.find();
while(iterator.hasNext()){
let temp=iterator.next();
print(temp.name);
}
// 迭代器还实现了迭代器接口,所以可以使用forEach。
var iterator= db.student.find();
iterator.forEach(function(temp){
print(temp.name);
});
find语法
find( query, fields)
query 查询条件,相当于sql的where
fields 查询的结果,字段映射,0不显示,1显示
explain("allPlansExecution") 返回查询计划信息和查询计划的执行统计信息
db.student.find({}, { "_id":0, "name":1}).limit(9).skip(5).sort({"name":-1}).pretty()
条件查询
db.student.find({name:"jay",age:16}) # 与操作
db.student.find({$or: [{age: 14}, {age: 28}]}); # 或操作$or
db.student.find({age: {$gt: 20}}) # 大于$gt
db.student.find({age: {$lt: 20}}) # 小于$lt
db.student.find({age: {$gte: 20}}) # 大于等于$gte
db.student.find({age: {$lte: 20}}) # 小于等于$lte
db.student.find({name: { $type : "string" }}); # 类型查询$type
db.student.find({age: {$exists: true}}) # 是否存在$exists
db.student.find({age: {$mod : [10, 0]}}); # 取模$mod
db.student.find({age: { "$ne" : 23}}) # 不等于$ne
db.student.find({name:{ "$in" : [ "jay" , "ab"]}}) # 包含$in
db.student.find({name:{$not:{"$in":["jay","ab"]}}})# 取非
db.student.find({name:{ "$nin":["jay","ab"]}}) # 不包含$nin
null查询
db.student.find({company:null}) # 查询company字段为null的文档
db.student.find({company:{$nin:[null]} }) # 查询company字段不为空的文档\
正则查询
db.student.find({"name":/^j/}) # 以j开头的字符串
嵌套查询
db.student.find({"phone":{"home" : 123321,"mobile" : 15820123123}}) # 指定完整的文档,查询出子文档完全匹配指定文档的文档。
db.student.find({"phone.home":123321}) # 如果我们不知道子文档的完整文档,只知道子文档中一个字段的值,可以通过点查询。
数组查询
db.student.find({favorite_number :[6, 8]}); # 精确匹配查询
db.student.find({favorite_number:6}); # 数组单元素查询
db.student.find({favorite_number : {$all : [6, 8]}}); # 数组多元素查询
db.student.find({favorite_number: {$size: 3}}); # $size数组长度查询
db.student.find({},{favorite_number: {$slice: 2}}); # $slice返回数组子集
db.student.find({},{favorite_number: {$slice: -2}});
db.student.find({phone.home:123456}); # 点查询用于查询更复杂的数组,例如数组中包含的是子文档的情况
db.student.find({phone.home:123456,"phone.mobile":13820123123}); # 数组的子文档如果有多个字段,查询出子文档同时满足两个条件的文档有两种方式
db.student.find( { # 或者,两者等价
phone: {
$elemMatch: {
home :123456,
mobile: 13820123123
}}})
索引查询
db.student.find({favorite_number.0:6}); # 数组都有索引,例如[6,8],6是第0个元素,8是第1个元素(数组索引以0开头)。要查找某个元素指定值的文档可以使用点和索引值
db.student.find({phone.2.home:123456}); # 点查询中只要数组的子文档里有一个home值满足查询值就会返回文档。如果我们要精确到第几个元素也可以用索引查询。
高级查询$where
- Javascript与$where结合使用,下面的全部等价
db.student.find({age: {$gt: 18}});
db.student.find({$where: "this.age > 18"});
db.student.find("this.age > 18");
f = function() {return this.age > 18}; db.student.find(f);
6.聚合查询
count和distinct
db.student.count({age: {$gte: 18}}) # 数量查询count
db.runCommand({"distinct":"student", "key":"age"}) # 不同值distinct
分组group
db.collection.group({
key:{field:1},
initial:{count:0},
cond:{},
reduce: function ( curr, result ) { },
keyf:function(doc){},
finalize:function(result) {}
})
数据如下:
{ "_id" : ObjectId("58d9b6afa159504ca6c572e0"), "name" : "jay", "age" : 28, "company" : "google", "name" : "a2" }
{ "_id" : ObjectId("58d9ba2d6097167df6313438"), "name" : "jay", "age" : 14 }
{ "_id" : ObjectId("58d9ba2d6097167df6313439"), "name" : "ad", "age" : 14 }
{ "_id" : ObjectId("58d9ba2d6097167df631343a"), "name" : "ad", "age" : 38 }
{ "_id" : ObjectId("58d9ba2d6097167df631343b"), "name" : "ad", "age" : 24 }
{ "_id" : ObjectId("58d9ba2e6097167df631343c"), "name" : "ab", "age" : 14 }
我们这里可以做一个统计:每个年龄有多少人,则使用age字段作为key,在reduce时进行同组的数量计数,finalize中组织结果文档格式。
使用代码如下:
db.student.group({
key:{age:1},
initial:{count:0},
cond:{"age":{$gt:13}},
reduce: function(curr,result) {
result.count += 1;
},
finalize:function(result) {
result.年龄=result.age;
result.人数=result.count;
}
});
使用MapReduce做一个统计:每个年龄有多少人,this表示当前文档,使用this.age的值作为key。在reduce时进行同组的数量计数,finalize中组织结果文档格式。
代码如下:
db.student.mapReduce(
function () {
emit(this.age, {age: this.age, count: 1});
},
function (key, values) {
var count = 0;
values.forEach(function(val) {
count += val.count;
});
return {age: key, count: count};
},
{
out: { inline : 1 },
finalize: function (key, reduced) {
return {"年龄": reduced.age, "人数": reduced.count};
}
}
)
第一个function是map函数,提交两个参数key和value,数据会根据key的值进行分组,把同组的value的值放入values数组中。
第二个function是reduce函数,key和values是第一个map函数的分组结果。
第三个out指定结果集生成在什么地方,inline:1,表示结果集放在内存中,仅适用于结果集符合16MB限制的情况
$project
数据如下:
{ "_id" : ObjectId("58d9ba2d6097167df6313438"), "name" : { "first" : "adrian", "last" : "jay" }, "age" : 14, "phone" : 111128912345 }
使用代码:
db.student.aggregate(
[
{ $project: { _id:0, age: 1, phone: "123456789", lastName: "$name.last" } }
]
)
$project映射结果集的文档结构,0表示排除字段,1显示字段,"123456789"直接赋值
$match
db.student.aggregate([{$match:{"name.last":"jay"}}])
$limit
db.student.aggregate({ $limit : 1 });
$skip
db.student.aggregate({ $skip : 2 });
$unwind
数据:
db.product.find()
{ "_id" : 1, "item" : "ABC1", "sizes" : [ "S", "M", "L" ] }
db.product.aggregate( [ { $unwind : "$sizes" } ] )
$group
数据:
db.student.find()
{ "_id" : ObjectId("58d9ba2d6097167df6313438"), "name" : "jay", "age" : 14 }
{ "_id" : ObjectId("58d9ba2d6097167df6313439"), "name" : "ad", "age" : 14 }
{ "_id" : ObjectId("58d9ba2d6097167df631343a"), "name" : "ad", "age" : 38 }
把数据根据age字段进行分组,使用命令:
db.student.aggregate([{$group : {_id : "$age"}}])
$sort
$sort将输入文档排序后输出,1为按字段升序,-1为降序。
我们有数据:
db.student.find()
{ "_id" : ObjectId("58d9ba2d6097167df6313438"), "name" : "jay", "age" : 14 }
{ "_id" : ObjectId("58d9ba2d6097167df6313439"), "name" : "ad", "age" : 14 }
{ "_id" : ObjectId("58d9ba2d6097167df631343a"), "name" : "ad", "age" : 38 }
使用命令:
db.student.aggregate([{$sort : {age :-1}}])
$lookup
数据:
db.product.insert({"_id":1,"name":"产品1","price":99})
db.product.insert({"_id":2,"name":"产品2","price":88})
db.order.insert({"_id":1,"pid":1,"name":"订单1"})
db.order.insert({"_id":2,"pid":2,"name":"订单2"})
db.order.insert({"_id":3,"pid":2,"name":"订单3"})
db.order.insert({"_id":4,"pid":1,"name":"订单4"})
db.order.insert({"_id":5,"name":"订单5"})
db.order.insert({"_id":6,"name":"订单6"})
$lookup作左连接组合两个集合的信息使用命令如下:
db.order.aggregate([
{
$lookup:
{
from: "product",
localField: "pid",
foreignField: "_id",
as: "orderDetail"
}
}
])
$geoNear
一、平面
我们使用lng和lat的命名,新建数据如下:
db.places.save({name:"肯德基",loc : { lng: 40.739037, lat: 73.992964 },category:"餐饮"})
db.places.save({name:"麦当劳",loc : { lng : 42.739037, lat: 73.992964 },category:"餐饮"})
db.places.save({name:"农行",loc : { lng: 41.739037, lat: 73.992964 },category:"银行"})
db.places.save({name:"地铁站",loc : { lng: 40.639037, lat: 73.992964 },category:"交通"})
2d索引创建方式如下:
db.places.createIndex( { "loc": "2d" } )
我们现在需要查到地铁站附近的文档信息,可以使用:
db.places.find({loc : {$near : { lng: 40.639037, lat:73.992964 }}})
aggregate和$geoNear能指定到范围,比如我们要查范围在坐标值相差2度(平面单位)以内的文档:
db.places.aggregate([
{
$geoNear: {
spherical:false,
distanceMultiplier:1,
near: { lng: 40.639037, lat:73.992964 },
distanceField: "dist.distacnce",
maxDistance: 2,
query: { category: "餐饮" },
includeLocs: "dist.location",
num: 1
}
}
])
二、球面
新建数据如下:
db.places.save({name:"肯德基",loc : { type: "Point", coordinates: [ 40.639037, 73.992964 ] },category:"餐饮"})
db.places.save({name:"麦当劳",loc : { type: "Point", coordinates: [ 42.739037, 73.992964 ] },category:"餐饮"})
db.places.save({name:"农行",loc : { type: "Point", coordinates: [ 41.739037, 73.992964 ] },category:"银行"})
db.places.save({name:"地铁站",loc : { type: "Point", coordinates: [ 40.639037, 73.992964 ] },category:"交通"})
创建2dsphere 索引使用代码:
db.places.createIndex( { loc : "2dsphere" } )
$geoNear用于输出某一地理位置2公里内的文档代码如下:
db.places.aggregate([
{
$geoNear: {
spherical: true,
near: { type: "Point", coordinates: [ 40.639037, 73.992964 ] },
distanceField: "dist.distacnce",
maxDistance: 2000,
query: { category:"餐饮" },
includeLocs: "dist.location",
num: 5
}
}
])
$group和管道表达式
测试数据准备:
db.product.insert({"_id":1,"name":"产品1","price":99,"type":"服装"})
db.product.insert({"_id":2,"name":"产品2","price":88,"type":"服装"})
db.product.insert({"_id":3,"name":"产品3","price":29,"type":"饰品"})
db.product.insert({"_id":4,"name":"产品4","price":78,"type":"服装"})
db.product.insert({"_id":5,"name":"产品5","price":9,"type":"饰品"})
db.product.insert({"_id":6,"name":"产品6","price":18,"type":"饰品"})
db.product.aggregate([{$group : {_id : "$type", price : {$sum : "$price"}}}]) # 求和$sum
db.product.aggregate([{$group : {_id : "$type", price : {$avg : "$price"}}}]) # 平均值$avg
db.product.aggregate([{$group : {_id : "$type", price : {$min : "$price"}}}]) # 最小值$min
db.product.aggregate([{$group : {_id : "$type", price : {$max : "$price"}}}]) # 最大值$max
db.product.aggregate([{$group : {_id : "$type", tags : {$push : "$name"}}}]) # 数组添加$push
db.product.aggregate([{$group : {_id : "$type", tags : {$addToSet : "$name"}}}])# 数组添加$addToSet
db.product.aggregate([{$group : {_id : "$type", product : {$first : "$name"}}}])# 首元素$first
db.product.aggregate([{$group : {_id : "$type", product : {$last : "$name"}}}]) # 尾元素$last
复合使用示例
数据如下:
{ "_id" : ObjectId("58d9b6afa159504ca6c572e0"), "name" : "jay", "age" : 28, "company" : "google", "name" : "a2" }
{ "_id" : ObjectId("58d9ba2d6097167df6313438"), "name" : "jay", "age" : 14 }
{ "_id" : ObjectId("58d9ba2d6097167df6313439"), "name" : "ad", "age" : 14 }
{ "_id" : ObjectId("58d9ba2d6097167df631343a"), "name" : "ad", "age" : 38 }
{ "_id" : ObjectId("58d9ba2d6097167df631343b"), "name" : "ad", "age" : 24 }
{ "_id" : ObjectId("58d9ba2e6097167df631343c"), "name" : "ab", "age" : 14 }
使用代码如下:
db.student.aggregate(
[
{ $match: { age:{"$gt":13} } },
{ $sort: { age: 1 } },
{ $limit: 2 },
{ $group: { _id: "$age", "人数": { $sum: 1 } } },
]
)
aggregate默认返回分组信息_id,如果要去掉,可使用$project。
因为aggregate是按顺序处理的管道阶段操作器,所以管道的排序也很重要,下面两端代码使用相同的管道阶段操作器,但是不同的顺序,实现的效果也是不同的:
代码一:
db.student.aggregate(
[
{ $match: { age:{"$gt":13} } },
{ $sort: { age: 1 } },
{ $limit: 2 },
{ $group: { _id: "$age", "人数": { $sum: 1 } } }
]
)
代码二:
db.student.aggregate(
[
{ $match: { age:{"$gt":13} } },
{ $group: { _id: "$age", "人数": { $sum: 1 } } },
{ $sort: { _id: 1 } },
{ $limit: 2 }
]
)
7.性能监控
-
db.stats(),查看当前数据库的状态,可看到数据库的名称,集合(表)数量,索引数量、大小,数据文件大小,存储空间大小和物理文件大小。
-
db.serverCmdLineOpts(),查看启动参数
-
db.serverStatus(),查询MongoDB的服务状态,有助于了解诊断和性能分析
serverStatus命令是静态的监控,MongoDB提供了动态的监控执行工具mongostat。
db.serverStatus().host # 主机名
db.serverStatus().locks # 锁信息
db.serverStatus().globalLock # 全局锁信息
db.serverStatus().mem # 内存信息
db.serverStatus().connections # 连接数信息
db.serverStatus().extra_info # 额外信息
db.serverStatus().indexCounters # 索引统计信息
db.serverStatus().backgroundFlushing # 后台刷新信息
db.serverStatus().cursors # 游标信息
db.serverStatus().network # 网络信息
db.serverStatus().repl # 副本集信息
db.serverStatus().opcountersRepl # 副本集的操作计数器
db.serverStatus().opcounters # 操作计数器
db.serverStatus().asserts # 断言信息Asserts
db.serverStatus().writeBacksQueued # writeBacksQueued
db.serverStatus().dur # 持久化(dur)
db.serverStatus().recordStats # 记录状态信息
db.serverStatus( { workingSet: 1 } ).workingSet # 工作集配置
db.serverStatus().metrics # 指标信息metrics
- mongostat,会动态输出一些serverStatus提供的重要信息,每秒输出一次。
mongostat会动态输出一些serverStatus提供的重要信息,每秒输出一次。
insert query update delete getmore command flushes mapped vsize res faults qrw arw net_in net_out conn time
*0 *0 *0 *0 0 11|0 0 0B 237M 15.0M 0 0|0 0|0 1.50k 22.7k 1 May 1 14:24:25.425
*0 *0 *0 *0 0 12|0 0 0B 237M 15.0M 0 0|0 0|0 1.55k 23.5k 1 May 1 14:24:26.405
*0 *0 *0 *0 0 11|0 0 0B 237M 15.0M 0 0|0 0|0 1.52k 23.0k 1 May 1 14:24:27.405
*0 *0 *0 *0 0 12|0 0 0B 237M 15.0M 0 0|0 0|0 1.52k 23.1k 1 May 1 14:24:28.404
*0 *0 *0 *0 0 11|0 0 0B 237M 15.0M 0 0|0 0|0 1.52k 23.0k 1 May 1 14:24:29.404
*0 *0 *0 *0 0 12|0 0 0B 237M 15.0M 0 0|0 0|0 1.53k 23.2k 1 May 1 14:24:30.396
insert、query、update、delete、getmore、command 每种对应操作的发生次数。
其中faults表示访问失败数,数据从内存交换出去,放到swap。值越小越好,最好不要大于100。
faults:查询从磁盘读取数据,标志服务器未达到最佳,所需的数据并未完全保存找内存中
qr/qw:队列等待的数目。
ar/aw:活动客户端的数目。
conn:打开的连接数。
flushes:数据刷写到磁盘的数目。
vsize:使用虚拟内存大小。
mapped:隐射的内存大小,约等于数据目录大小。
res:实际使用的内存大小
netId:表示通过网络传输进来的字节数。
netou:t表示通过网络传输出的字节数。
time:表示统计的时间。
-
mongotop,查看哪个几个最繁忙
-
db.currentOP(),可看到当前执行的进程,类似MySQL的show processlist
-
show profile
db.setProfilingLevel(2) # enable profiling
db.system.profile.find() # show raw profile entries
show profile # 该命令可以查看最近的5条记录
该命令可以查看最近的5条记录:
ts:该命令在何时执行。
millis:执行耗时,以毫秒为单位。
op:什么操作。
query:设置的查询条件。
nReturned:返回的条数。
docsExamined:文档扫描条数。
# 清空还原profile集合使用命令:
db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection("system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(1)
8.备份和恢复
1).数据库备份和恢复
- mongodump导出数据库中全部的内容,使用-q参数增加查询条件,注意-q参数值的标点符号,否则会报错 too many positional arguments
mongodump --port 22400 -u "root" -p "123456" --authenticationDatabase "admin" -d test -o /home
mongodump --port 22400 -u "root" -p "123456" --authenticationDatabase "admin" -d test -c user -q "{name:'joe'}" -o /home
- mongorestore使用的数据文件就是mongodump备份的数据文件
# 使用/home路径下的BSON和JSON文件恢复数据库test,--drop参数表示如果已经存在test数据库则删除原数据库,去掉--drop则与原数据库合并
mongorestore --port 22400 -u "root" -p "123456" --authenticationDatabase "admin" -d test /home/test --drop
2).表的备份和恢复
- 导出json格式的备份文件,从test数据库中student集合到/home/test.json文件中
mongoexport --port 22400 -u "root" -p "123456" --authenticationDatabase "admin" -d test -c student -o /home/test.json
mongoexport --port 22400 -u "root" -p "123456" --authenticationDatabase "admin" -d test -c student -q "{name: 'joe'}" -o /home/test.json
- 导出csv格式的备份文件
# -f参数用于指定只导致id和name以及age字段,因为csv是表格类型的,所以对于内嵌文档太深的数据导出效果不是很好,所以一般来说会指定某些字段导出。
mongoexport --port 22400 -u "root" -p "123456" --authenticationDatabase "admin" -d test -c student --csv -f _id,name,age -o /home/test.csv
- json格式导入,使用备份文件/home/test.json导入数据到test数据库的student集合中
# --upsert表示更新现有数据,如果不使用—upsert则导入时已经存在的文档会报_id重复,数据不再插入。也可以使用--drop删除原数据。
mongoimport --port 22400 -u "root" -p "123456" --authenticationDatabase "admin" -d test -c student /home/test.json --upsert
- csv格式导入,--headerline指明不导入第一行,csv格式的文件第一行为列名
mongoimport --port 22400 -u "root" -p "123456" --authenticationDatabase "admin" -d test -c student --type csv --headerline --file /home/test.csv