欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

学习使用mongoDB和pymongo

程序员文章站 2022-05-28 22:15:42
[ ] 本文出处:http://b1u3buf4.xyz/ " ] 本文作者:[B1u3Buf4" [ ] 本文授权:禁止转载 从自己的另一处博客移动过来。 前述和安装 mongoDB按照分类应当是非关系型数据库,这种数据库没有传统sql那样的表的概念,自然也不支持多表查询。 linux 安装 官方 ......

  • [*] 本文出处:
  • [*] 本文作者:b1u3buf4
  • [*] 本文授权:禁止转载

从自己的另一处博客移动过来。

前述和安装

mongodb按照分类应当是非关系型数据库,这种数据库没有传统sql那样的表的概念,自然也不支持多表查询。

linux 安装

官方的linux安装文档在

安装方法无外乎是两种:

一种是下载源文件,然后手动安装;另一种是通过包管理器进行安装。

介绍通过包管理在ubuntu上安装:

向包管理系统导入公钥

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930adae8caf5059ee73bb4b58712a2291fa4ad5

创建文件列表(这里是16.04,不同版本此处有差别)

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list

更新包数据

sudo apt-get update

安装最新的稳定版

sudo apt-get install -y mongodb-org

通过启动服务命令,然后就可以运行mongodb了。

docker容器部署

拉取镜像:

docker pull mongo:latest

创建、运行一个容器:

docker run -p 27017:27017 -d mongo:latest #其他参数自定

坑人的地方

首先是docker自身的不稳定性,会导致数据丢失。典型的就是有时候容器坏了拉不起来,然后要重新配置。所有的数据自然而然是没有了。

其次是效率。相对于直接使用,性能有所损耗,在大量写入的时候耗时多。

不推荐盲目地在生产中使用docker下的mongodb。做测试是可以的。

windows安装

在官方网站上下载mongodb,最新的版本只支持64位。

打开安装包,选择“custom”自定义安装,安装路径可以修改到非系统盘。然后不断“下一步”,安装至结束。

创建数据库文件的存放位置

因为启动mongodb服务之前需要必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。数据存放的位置也是比较随意的。命令行中使用如下命令启动mongodb服务:mongod --dbpath 数据存放位置的绝对地址,命令行中会看到一些初始化的内容。如果不成功,可以查看一下端口是否被占用。

命令行下运行mongodb服务器或者配置mongodb服务,两者任选一个方式启动就可以了。

新建一个mongo.config并输入(dbpath是数据存储的地址,logpath是记录日志的地址。):

dbpath=d:\data
logpath=d:\mongodb\mongo.log

在管理员cmd下输入:mongod --config mongo.config --install --servicename "mongodb"。即根据刚创建的mongo.config配置文件安装服务,名称为mongodb。

之后就可以通过命令或者在“服务”中控制mongodb了。

启动mongodb服务
net start mongodb
关闭mongodb服务
net stop mongodb

gui管理器

之前一直使用一个叫robo3t的gui管理软件,功能中规中矩。虽然版本不是很新,测试是可以兼容最新的mongodb的。

推荐使用官方自带的mongodb compass。简洁,强大。在安装mongodb之后会提示安装。

mongodb和关系型数据库不同之处

database     database     数据库/数据库
table        collection   数据表/集合
row          document     数据记录行/文档
column       field        数据字段/域
index        index        索引/索引
table joins               表连接/mongodb不支持
primary key  primary key  主键/mongodb自动将_id字段设置为主键

mongodb语法

附带了sql语句,以便理解。

查询所有表中信息

db.users.find()
select * from users

条件查询

db.users.find({"username" : "joe", "age" : 27})
select * from users where "username" = "joe" and age = 27

依据条件查询所有信息

db.users.find({}, {"username" : 1, "email" : 1})
select username, email from users
#明确注意禁止_id值的返回
db.users.find({}, {"username" : 1, "_id" : 0})

数值范围条件查询

#$lt(小于) $lte(小于等于) $gt(大于) $gte(大于等于)
db.users.find({"age" : {"$gte" : 18, "$lte" : 40}})
select * from users where age >=18 and age <= 40

不等条件查询

db.users.find({"username" : {"$ne" : "joe"}})
select * from users where username <> "joe"

表范围查询

db.users.find({"ticket_no" : {"$in" : [725, 542, 390]}})
select * from users where ticket_no in (725, 542, 390)
db.users.find({"ticket_no" : {"$nin" : [725, 542, 390]}})
select * from users where ticket_no not in (725, 542, 390)

同集合多条件查询

db.users.find({"$or" : [{"ticket_no" : 725}, {"winner" : true}]})
select * form users where ticket_no = 725 or winner = true

pymongo模块用法

安装pymongo

pip install pymongo

导入模块

import pymongo

仅做客户端操作的时

from pymongo import mongoclient

建立连接

conn = mongoclient('192.168.0.111', 27017)
或者
conn = mongoclient('192.168.0.111:27017')

连接至数据库

db = conn.mydb
或者
db = conn['mydb']

mydb为所要连接的数据库,如果不存在,则创建数据库。

连接选择数据集合

myset = db.test
或者
myset = conn.mydb.test

test为所要使用的集合,没有则自动创建。

查看全部集合

db.collection_names()

查看指定集合中某条记录

db.account.find_one({"key":"value"})

查看指定集合的字段

db.account.find_one({},{"k1":v1,"k2":"v2"})

查看指定集合中多条记录

for item in db.account.find():
    item
for item in db.account.find({"name":"li"}):
    item["name"]

查看指定集合记录统计

db.account.find().count()
db.account.find({"key":"value"}).count()

集合查询结果排序

db.account.find().sort("name") #默认为升序
db.account.find().sort("name",pymongo.ascending) #升序
db.account.find().sort("name",pymongo.descending) #降序

集合查询结果多列排序

db.account.find().sort([("name",pymongo.ascending),("add",pymongo.descending)])

还有一个find_one()的方法,返回符合条件的一条记录,而find()则是返回返回所有可能的内容。

通常在需要随机抽出一条内容的情况下使用find_one()更实用。

更高级的扩展

下面方法在执行完相应第一个的操作之后,会附加进行另一个操作。

查找之后进行删除

find_one_and_delete()

查找之后进行更新

find_one_and_update()

查找之后进行替换

find_one_and_replace()

添加记录

db.account.insert({"id":21,"name":"ling"})

修改记录

db.account.update({"user":"li"},{"$set":{"add":"bj","pw":"123"}})

删除记录

db.account.remove() #全部删除
db.test.remove({"key":"value"}) #指定删除