Mongodb

安装与使用

Posted by JackyCJ on October 31, 2019

一、Mac下安装

brew install mongodb

检查安装是否成功

mongod -version

浏览器访问: localhost:27017

配置数据库

MongoDB默认数据库目录

系统 默认目录
Windows c:\data
Mac /data/db

首先创建保存数据的文件夹:

sudo mkdir -p /data/db

给刚创建的文件夹写入数据权限:

sudo chown -R $USER /data/db

R是recursive递归的意思,也可以通过finder手动创建文件夹/data/db。

如果不想把数据放在默认目录,可以自行指定:

# command
mongod -dbpath /path
# config
mongod -config /mongo.cfg

config内容

dbpath=/.../db
logpath=/.../mongo.log  

启动mongod服务

mongod服务也就是mongodb数据库,启动mongod服务端只需要一个很简单的命令:

mongod

二、可视化工具

下载Robomongo

三、通过Python调用

import pymongo

mycl = pymongo.MongoClient('localhost', 27017)
print(mycl.database_names())
# py3.7以后使用list_database_names()
mydb = mycl.test_database
print(mydb.collection_names())

# 创建
mydb = mycl['dbname']
# 集合
mycol = mydb['colname']

1.添加

1.1.插入一条

mydict = {"name": "test", "url": "https://jackycj.github.io"}
mycol.insert_one(mydict)

1.2.插入多条

mydicts = [
	{"name": "test", "url": "https://jackycj.github.io"},
	{"name": "test", "url": "https://jackycj.github.io"}
]
mycol.insert_many(mydicts)

2.查询

2.1.查询单条

x = mycol.find_one()
print(x)

2.2.查询全部

for x in mycol.find():
	print(x)

2.3.查询指定字段

我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1。除了 _id 你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。

for x in mycol.find({},{ "_id": 0, "name": 1}):
	print(x)

2.4.返回指定条数记录

如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。

ret = mycol.find().limit(3)

3.排序

sort() 方法可以指定升序或降序排序。

# 默认升序
ret = mycol.find().sort('name')

sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。

# 降序
ret = mycol.find().sort('name', -1)

4.修改

4.1.修改一个记录

我们可以在MongoDB中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。 如果查找到的匹配数据多余一条,则只会修改第一条。

myquery = { "name": "test" }
newvalues = { "$set": { "name": "12345" } }
mycol.update_one(myquery, newvalues)

通过 find_one_and_update() 方法查询并修改文档中的记录, 返回更新前的记录。

myquery = { "name": "test" }
newvalues = { "$set": { "name": "12345" } }
mycol.find_one_and_update(myquery, newvalues)

4.2.修改多个记录

通过 update_one() 方法只能修匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()

以下实例将查找所有以t开头的 name 字段,并将匹配到所有记录的 name 字段修改为123:

myquery = { "name": { "$regex": "^t" } }
newvalues = { "$set": { "name": "123" } }
x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "文档已修改")

5.删除

5.1.删除一个文档

我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

myquery = { "name": "test" }
mycol.delete_one(myquery)

5.2.删除多个文档

我们可以使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

删除所有 name 字段中以 t 开头的文档:

myquery = { "name": {"$regex": "^t"} }
x = mycol.delete_many(myquery)
print(x.deleted_count, "个文档已删除")

5.3.删除集合中的所有文档

delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:

x = mycol.delete_many({})
print(x.deleted_count, "个文档已删除")

5.4.删除集合

我们可以使用 drop() 方法来删除一个集合。如果删除成功返回 true,如果删除失败(集合不存在)则返回 false。

mycol.drop()

6. 查找重复项

_id: 需要查重的字段名

db.getCollection('list').aggregate([
{ $group: { _id:'$title', count: { $sum: 1}}},
{ $match: { count: { $gt: 1}}}
])

7. 导出和导入

7.1 导出

使用MongoDB自带的mongoexport.exe工具导出数据

1.打开命令行cmd,进入mongodb的安装目录Bin文件夹
2.然后输入如下语句:
$ mongoexport -d db -c col -f field --type csv -o file
其中,“d”是使用的Mongo数据库,“c”指的是数据库集合(也就是数据库表),“f”指的是域(也就是要导出的数据字段),“o”指的是csv文件的输出路径。
3.打开输出的csv文件即可查看

示例

$ mongoexport -h 127.0.0.1:27017 -u root -p 123456 --authenticationDatabase admin -d IndicatorPlatform -c calcgsdataflash -q{gscode:'ZTJB',ymd:{$gte:20190801,$lte:20190820}} --type csv -f gscode,gpcode,ymd,hms,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,time -o D:\tmp\ZTJB_20190820.csv

7.2 导入

使用MongoDB自带的mongoimport.exe工具导出数据

1.打开命令行cmd,进入mongodb的安装目录Bin文件夹
2.然后输入如下语句:
$ mongoimport -d db -c col -f field --type csv --f file
其中,“d”是使用的Mongo数据库,“c”指的是数据库集合(也就是数据库表),“f”指的是域(也就是要导出的数据字段),“o”指的是csv文件的输出路径。

示例

$ mongoimport -h 127.0.0.1:27017 -u root -p 123456 --authenticationDatabase admin -d IndicatorPlatform -c calcgsdataflash --type csv --headerline --file D:/tmp/ZTJB_20180716.csv

MAC OS下工具路径: /usr/local/MongoDB/bin

7.3 使用python导出

collection.find()得到的字段___id__是自动生成的ObjectId.
ObjectId:主键,是一个12字节的 BSON类型字符串。按照字节顺序,依次代表:
4字节:UNIX时间戳
3字节:表示运行MongoDB的机器
2字节:表示生成此_id的进程
3字节:由一个随机数开始的计数器生成的值
在输出JSON时,只需输出12字节,不需要输出整个ObjectId

8. 备份和恢复

mongodump命令脚本语法如下:

mongodump -h dbhost -d dbname -o dbdirectory
mongodump
  • -h:
    MongoDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
  • -d:
    需要备份的数据库实例,例如:test
  • -o:
    备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

mongorestore命令脚本语法如下:

mongorestore -h <hostname><:port> -d dbname <path>
  • –host <:port>, -h <:port>:
    MongoDB所在服务器地址,默认为: localhost:27017
  • –db , -d :
    需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
  • –drop:
    恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
  • : mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。 你不能同时指定 _<_path_>_ 和 --dir 选项,--dir也可以设置备份目录。
  • –dir:
    指定备份的目录
    你不能同时指定 _<_path_>_ 和 --dir 选项。

接下来我们执行以下命令:

mongorestore
mongorestore -d name path

9. 命令行操作

db.help()                    help on db methods
db.mycoll.help()             help on collection methods
sh.help()                    sharding helpers
rs.help()                    replica set helpers
help admin                   administrative help
help connect                 connecting to a db help
help keys                    key shortcuts
help misc                    misc things to know
help mr                      mapreduce

show dbs                     show database names
show collections             show collections in current database
show users                   show users in current database
show profile                 show most recent system.profile entries with time >= 1ms
show logs                    show the accessible logger names
show log [name]              prints out the last segment of log in memory, 'global' is default
use <db_name>                set current database
db.foo.find()                list objects in collection foo
db.foo.find( { a : 1 } )     list objects in foo where a == 1
it                           result of the last line evaluated; use to further iterate
DBQuery.shellBatchSize = x   set default number of items to display on shell
exit                         quit the mongo shell

汇总

对MongoDB操作语法进行汇总如下

功能 语法 备注
添加数据 insert_one() insert_many()  
查询数据 find_one() find_many()  
数据排序 sort()  
修改数据 update_one() update_many()  
删除数据 delete_one() delete_many() drop()  

参考文档