MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活(总体来看,python对MongoDB的操作与直接在MongoDB操作大致相同)
1. 连接MongoDB
连接MongoDB时,需要使用PyMongoDB库中的MongoClient。一般来说,传入MongoDB的IP及端口即可,其中第一个参数为地址host,第二个参数为端口port(如果不给它传递参数,默认是27017)
这样就创建了MongoDB的连接对象了。
另外,MongoClient第一个参数host还可以直接传入MongoDB的连接字符串,它以mongodb开头,例如
2. 指定数据库
MongoDB中可以建立多个数据库,接下来需要指定哪个数据库。这里以test数据库为例
这里调用client的test属性即返回test数据库。当然也可以这样指定:
db = client[\'test\']这两种方法是等价的。
3. 指定集合
MongoDB的每个数据库包含许多集合(collection),类似于关系型数据库中的表
下一步需要指定操作的集合,这里指定一个集合名称为students。与指定数据库类似,指定数据库也有两种方式:
这样就声明了Collection对象
4. 插入数据
接下来,便可以插入数据了。对于students这个集合,新建一条学生数据,这条数据以字典形式表示:
这里指定了学生的学号、姓名、年龄和性别。接下来,直接调用collection的insert()方法即可插入数据,代码如下:
result = collection.insert(student) print(result)在MongoDB中,每条数据其实都有一个_id属性来唯一标识。如果没有显式指明该属性,MongoDB会自动产生一个ObjectId类型的_id属性。insert()方法会在执行后返回_id值。
运行结果:
5932a68615c2606814c91f3d
当然,我们也可以同时插入多条数据,只需要以列表形式传递即可,示例如下:
返回结果是对应的_id的集合:
[ObjectId(\'5932a80115c2606a59e8a048\'), ObjectId(\'5932a80115c2606a59e8a049\')]
实际上,在PyMongo 3.x版本中,官方已经不推荐使用insert()方法了。当然,继续使用也没有什么问题。官方推荐使用insert_one()和insert_many()方法来分别插入单条记录和多条记录,示例如下:
运行结果如下:
<pymongo.results.InsertOneResult object at 0x10d68b558> 5932ab0f15c2606f0c1cf6c5与insert()方法不同,这次返回的是InsertOneResult对象,我们可以调用其inserted_id属性获取_id。
对于insert_many()方法,我们可以将数据以列表形式传递,示例如下:
运行结果如下:
<pymongo.results.InsertManyResult object at 0x101dea558> [ObjectId(\'5932abf415c2607083d3b2ac\'), ObjectId(\'5932abf415c2607083d3b2ad\')]该方法返回的类型是InsertManyResult,调用inserted_ids属性可以获取插入数据的_id列表。
5. 查询
插入数据后,我们可以利用find_one()或find()方法进行查询,其中find_one()查询得到的是单个结果,find()则返回一个生成器对象。示例如下:
这里我们查询name为Mike的数据,它的返回结果是字典类型,运行结果如下:
<class \'dict\'> {\'_id\': ObjectId(\'5932a80115c2606a59e8a049\'), \'id\': \'20170202\', \'name\': \'Mike\', \'age\': 21, \'gender\': \'male\'}可以发现,它多了_id属性,这就是MongoDB在插入过程中自动添加的。
此外,我们也可以根据ObjectId来查询,此时需要使用bson库里面的objectid:
其查询结果依然是字典类型,具体如下:
{\'_id\': ObjectId(\'593278c115c2602667ec6bae\'), \'id\': \'20170101\', \'name\': \'Jordan\', \'age\': 20, \'gender\': \'male\'}