Python MongoDB使用初步

Stella981
• 阅读 665

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。它是一个面向文档存储的数据库,操作起来比较简单。可通过本地或者网络创建数据镜像,具有很强的可扩展性。MongoDB 支持的编程语言有Ruby,Python,Java,C++,C#,PHP等。本文以Windows平台为例,介绍Windows下MongoDB的安装和使用方法。

1 安装MongoDB

进入MongoDB官网,https://www.mongodb.com/download-center/community ,如下图

Python MongoDB使用初步

从右侧下载栏目中找到windows平台,version选择最新即可。下载后双击打开进入安装步骤,可以自定义安装路径,如果不想安装在默认的C盘,可以自定义到D盘或者E盘等。在安装中有一个默认安装MongoDB compass的选项,一般我们不需要用GUI来管理,所以可以去掉勾选。

安装完成后,需要为MongoDB手动创建数据存储目录。这个数据目录需要放在根目录下(如C:\和D:\)。如果程序安装在了D盘,那么我们就在D盘根目录创建一个data文件夹,在data文件夹中继续创建一个db文件夹,这样就有了一个数据目录“D:\data\db”。

2 运行MongoDB服务器

要使用MongoDB,需要先将服务器运行起来。在第一步中已经安装好了MongoDB,那么我们要通过命令行(使用cmd或者windows powershell)进入到安装目录下的工具箱

Your_Path_To_MongoDB\MongoDB\Server\4.2\bin。例如我自己的安装路径为D:\Program Files\MongoDB\Server\4.2\bin。

Python MongoDB使用初步

然后运行.\mongod.exe --dbpath d:\data\db

Python MongoDB使用初步

如果没有报错则运行成功。有的时候MongoDB安装完了提示需要重启才能使用,那么可以在安装完之后先重启机器。

关于端口问题,网上有些同学说连接MongoDB失败,那可能是因为使用了不同的端口去连接。MongoDB在自己的配置文件(mongod.cfg)中默认配置了监听端口为27017,所以如果你希望使用别的端口可以在配置文件中更改,也可以使用 “--port 端口号” 来指定端口。

3 使用Python操作数据库

Python需要通过PyMongo这个库来实现与MongoDB的连接。建议使用Python3自带的pip包管理工具来安装pymongo。

pip3 install pymongo

安装完之后,在python环境中使用 import pymongo 来测试安装是否成功。

一些常用的命令如下:

(1) 创建数据库

创建数据库需要使用MongoClient对象

#!/usr/bin/python3

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

mydb = myclient["testdb"]

MongoDB数据库只有在插入数据后才会真正创建。也就是说数据库创建集合(数据表)后,必须再插入一个文档(记录),数据库才创建完成。

判断数据库是否已经存在:

dblist = myclient.list_database_names()

if "testdb" in dblist:

    print("testdab has already existed!")

(2) 创建集合

mycol = mydb["mycollection"]

判断集合是否已经存在:

collist = mydb. list_collection_names()

if " mycollection " in collist:

    print("mycollection existed!")

(3) 添加数据

在集合中插入一个文档(记录)的方法如下:

mydict = {"name": "jack"}

x = mycol.insert_one(mydict)

如果没有指定 “_id”的值,会默认添加一个 '_id': ObjectId('5ee6e728228cbb51bb416a1c'),它是插入文档的 “_id” 值。在没有指定 “_id”时候,MongoDB 会为每个文档添加一个唯一的 id,所以一般可以自己指定这个“_id”的值。

插入多个文档的方法如下:

mydict = [{ "name": "jack" }, {"name": "lucy"}]

x = mycol.insert_many(mydict)

指定_id输入方法:

mydict = [{ "_id": "1", "name": "jack" }, {"_id": "2", "name": "lucy"}]

x = mycol.insert_many(mydict)

(4) 查询数据

查询第一条数据:

x = mycol.find_one()

查询所有数据:

for x in mycol.find():

    print(x)

使用find()查询指定字段的数据

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

    print(x)

根据条件查询:

myquery = { "name": "lucy" }

mydoc = mycol.find(myquery)

for x in mydoc:

    print(x)

还可以通过对查询条件进行设置来实现高级查找。此处不再赘述。

如果要设置指定条数的记录,可以这样,只返回10条记录

myresult = mycol.find().limit(10)

(5) 修改数据

使用update_one()可以修改一个文档

myquery = { "name": "jack" }

newvalues = { "$set": { "name": "12345", "age": "12"  } }

mycol.update_one(myquery, newvalues)

update_one() 方法只能修匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()。下面这个命令是将所有“name”字段以“l”开头的文档中的“age”设置为“23”。

myquery = { "name": { "$regex": "^l" } }

newvalues = { "$set": { "age": "23" } }

x = mycol.update_many(myquery, newvalues)

(6) 数据排序

按照“_id”升序排列:

mydoc = mycol.find().sort("_id")

按照“_id”降序排列:

mydoc = mycol.find().sort("_id", -1)

(7) 删除数据

删除一个文档:

myquery = { "name": "jack" }

mycol.delete_one(myquery)

删除多个“name”字段以“N”开头的文档:

myquery = { "name": {"$regex": "^N"} }

x = mycol.delete_many(myquery)

4 总结

使用数据库操作文档数据,实现更加复杂的系统功能。本文只介绍了一些初步的操作知识,更加多的操作可以参考一些在线文档。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这