mongodb小技能

MongoDB小技能

MongoDB导入导出

  • 数据导出

    MongoDB中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。

    命令:

    mongoexport -d dbname -c collectionname -o file --type json/csv -f field

    参数说明:

​ -d :数据库名

​ -c :collection名

​ -o :输出的文件名

​ –type : 输出的格式,默认为json

​ -f :输出的字段,如果-type为csv,则需要加上-f “字段名”

  • 数据导入

    命令:

    mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field

    参数说明:

​ -d :数据库名

​ -c :collection名

​ –type :导入的格式默认json

​ -f :导入的字段名

​ –headerline :如果导入的格式是csv,则可以使用第一行的标题作为导入的字段

​ –file :要导入的文件

MongoDB备份与恢复

  • 备份

    命令:

    mongodump -h dbhost -d dbname -o dbdirectory

    参数说明:

​ -h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017

​ -d: 需要备份的数据库实例,例如:test

​ -o: 备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放 该数据库实例的备份数据。

  • 恢复

    命令:

    mongorestore -h dbhost -d dbname --dir dbdirectory

    参数或名:

​ -h: MongoDB所在服务器地址

​ -d: 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2

​ –dir: 备份数据所在位置,例如:/home/mongodump/itcast/

​ –drop: 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用!

注:以上命令的执行目录为Mongodb安装路径下的bin文件夹下

MongoDB建索引

命令:

1
2
3
{
"name" : 1 # name表示你要简历索引的字段
}

1表示升序索引,-1表示降序索引

如果是多字段联合索引,就相当于在字典里添加元素:

1
2
3
4
{
"name" : 1,
"number": 1
}

另外以Robo 3T为例,建索引时还有唯一索引(unique)、删除重复(Drop duplicates)的可选项。

如果在创建索引时,库里已有存量数据,如果勾选唯一索引,库里该索引字段存在重复的值,是无法成功建立索引的,除非同时勾选删除重复数据选项,或者不建立唯一索引。

MongoDB查询命令

MongoDB 查询集合中有重复值的字段,并显示重复次数

例如有以下集合companies:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"_id" : ObjectId("5d4bee825d980af9ed04764b"),
"enter_name" : "小米科技有限责任公司",
"key1" : "value1",
"key2": "value2",
...
}
{
"_id" : ObjectId("5d4bee825d980af9ed04764b"),
"enter_name" : "华为技术有限责任公司",
"key1" : "value1",
"key2": "value2",
...
}
...
{
"_id" : ObjectId("5d4bee825d980af9ed04764b"),
"enter_name" : "魅族科技有限责任公司",
"key1" : "value1",
"key2": "value2",
...
}

想知道有哪些”enter_name”字段具有重复值,也就说同一个公司名称在companies集合中存在多条数据,使用以下命令:

1
2
3
4
db.getCollection('companies').aggregate([
{$group: {_id: '$enter_name', count: {$sum : 1}}},
{$match: {count: {$gt : 1}}}
])

输出形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 1 */
{
"_id" : "西安职业技术学院",
"count" : 2.0
}

/* 2 */
{
"_id" : "玛曲县污水处理厂",
"count" : 2.0
}

/* 3 */
{
"_id" : "白银市平川区清源污水处理厂",
"count" : 2.0
}

表示以上公司名称在companies集合中存在多条数据,具体条数均为2条。

MongoDB查询集合中某字段所有不同值以及总共的条数

命令为:

db.collectionName.distinct("字段名")

注:db.getCollection(collection_name).distinct("字段名")也是可以的

等价于sql语句:

select distinct 字段名 from collectionName

如果想直接查询不同值总共的条数:

db.collectionName.distinct("字段名").length

以上面的集合companies为例,查询”enter_name”字段所有不同值的记录总条数

db.companies.distinct("enter_name").length

MongoDB排序

命令为:

db.getCollection(collection_name).find({}).sort({key: 1})

key表示指定的排序字段,1表示升序排序,-1表示降序排序。

MongoDB查询指定时间范围的数据

mongodb里比较,用 “$gt” 、”$gte”、 “$lt”、 “$lte”(分别对应”>”、 “>=” 、”<” 、”<=”),组合起来可以进行范围的查找。

1
2
db.CollectionAAA.find({ "CreateTime" : { "$gte" : ISODate("2017-04-20T00:00:00Z")
, "$lt" : ISODate("2017-04-21T00:00:00Z") } }).count()

前提是CreateTime字段是ISODate类型。