mongo

一、应用场景

1.基于地理位置计算
2.日志存储
3.游戏场景,存储用户信息,装备,积分等
4.社交场景,存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能

二、mongo特点

1.高性能:提供高性能的数据持久性,减少数据库系统上的I/O操作
2.高可用性:mongo的复制工具,成为副本集,提供自动故障转移和数据冗余
3.支持多种存储引擎:wiredtiger存储引擎,mmapv1存储引擎和inmemory存储引擎
4.水平扩展性:mnogo提供了可扩展性,作为其核心功能的一部分,分片是将数据分在一组计算机上。

三、安装部署

目录规划

以软链接形式放在/opt目录下

软件安装

[root@mysql ~]# yum install libcurl openssl -y
[root@mysql ~]# mkdir -p /opt/mongo_cluster/
[root@mysql ~]# mkdir /data/soft -p
[root@mysql ~]# cd /data/soft/
[root@mysql soft]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz
[root@mysql soft]# tar zxvf mongodb-linux-x86_64-3.6.13.tgz -C /opt/mongo_cluster/
[root@mysql soft]# cd /opt/mongo_cluster/
[root@mysql mongo_cluster]# ls
mongodb-linux-x86_64-3.6.13
[root@mysql mongo_cluster]# ln -s mongodb-linux-x86_64-3.6.13 mongodb
[root@mysql mongodb]# mkdir -p /opt/mongo_cluster/mongo_27017/{conf,logs,pid}
[root@mysql mongodb]# mkdir -p /data/mongo_cluster/mongo_27017

配置文件
vim /opt/mongo_cluster/mongo_27017/conf/mongodb.conf

systemLog:
  destination: file
  logAppend: true
  path: /opt/mongo_cluster/mongo_27017/logs/mongodb.log
storage:
  journal:
    enabled: true
  dbPath: /data/mongo_cluster/mongo_27017
  directoryPerDB: true
  wiredTiger:
     engineConfig:
        cacheSizeGB: 1
        directoryForIndexes: true
     collectionConfig:
        blockCompressor: none
     indexConfig:
        prefixCompression: true
processManagement:
  fork: true
  pidFilePath: /opt/mongo_cluster/mongo_27017/pid/mongod.pid
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.119.171

启动命令:

[root@mysql mongo_cluster]# pwd
/opt/mongo_cluster
[root@mysql mongo_cluster]# mongodb/bin/mongod -f mongo_27017/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 7821
child process started successfully, parent exiting
[root@mysql mongo_cluster]# ps -ef|grep mongo
root       7350      1  7 21:13 ?        00:00:05 mongodb/bin/mongod -f mongo_27017/conf/mongodb.conf
root       7379   7326  0 21:14 pts/0    00:00:00 grep --color=auto mongo
[root@mysql mongo_cluster]# netstat -tupln|grep 27017
tcp        0      0 192.168.119.171:27017   0.0.0.0:*               LISTEN      7350/mongodb/bin/mo
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      7350/mongodb/bin/mo

关闭命令

[root@mysql mongo_cluster]# mongodb/bin/mongod -f mongo_27017/conf/mongodb.conf --shutdown
killing process with pid: 7350
[root@mysql mongo_cluster]# ps -ef|grep mongo
root       7390   7326  0 21:25 pts/0    00:00:00 grep --color=auto mongo

四、优化启动警告

WARNING: Access control is not enabled for the database.
WARNING: You are running this process as the root user, which is not recommended.
WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.

上述的后两条都是要关闭大内存页
临时关闭

[root@mysql ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[root@mysql ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
[root@mysql ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@mysql ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
[root@mysql ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[root@mysql ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

永久关闭命令,用官方的脚本写入开机自启动
vim /etc/init.d/disable-transparent-hugepages

#!/bin/bash
### BEGIN INIT INFO
# Provides: disable-transparent-hugepages
# Required-Start: $local_fs
# Required-Stop:
# X-Start-Before: mongod mongodb-mms-automation-agent
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description: Disable Linux transparent huge pages, to improve
# database performance.
### END INIT INFO
case $1 in
  start)
    if [ -d /sys/kernel/mm/transparent_hugepage ];then
      thp_path=/sys/kernel/mm/transparent_hugepage
    elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/redhat_transparent_hugepage
    else
      return 0
    fi
    echo 'never' > ${thp_path}/enabled
    echo 'never' > ${thp_path}/defrag
    re='^[0-1]+$'
    if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
    then
      # RHEL 7
      echo 0 > ${thp_path}/khugepaged/defrag
    else
      # RHEL 6
      echo 'no' > ${thp_path}/khugepaged/defrag
    fi
    unset re
    unset thp_path
    ;;
esac

授予脚本权限

[root@mysql ~]# chmod 755 /etc/init.d/disable-transparent-hugepages

加入开机自启动

[root@mysql ~]# chkconfig --add disable-transparent-hugepages

然后再关闭mongo,再启动mongo,就看不到上面最后两条警告啦

[root@mysql ~]# /opt/mongo_cluster/mongodb/bin/mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf -                                             -shutdown
[root@mysql ~]# /opt/mongo_cluster/mongodb/bin/mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf                      

就剩下面两条警告啦

1、WARNING: Access control is not enabled for the database.
2、WARNING: You are running this process as the root user, which is not recommended.

2的解决方案:普通用户启动
要在root用户下,将mongo服务关闭,才可进行操作

[root@mysql ~]# useradd mongo
[root@mysql ~]# echo '123456'|passwd --stdin mongo
更改用户 mongo 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@mysql ~]# chown -R mongo:mongo /opt/mongo_cluster
[root@mysql ~]# chown -R mongo:mongo /data/mongo_cluster
[root@mysql ~]# cd /opt/mongo_cluster/
[root@mysql mongo_cluster]# su  mongo
[mongo@mysql ~]$ tail -1 .bashrc
export PATH=/opt/mongo_cluster/mongodb/bin:$PATH
[mongo@mysql ~]$ source .bashrc
[mongo@mysql ~]$ mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 7468
child process started successfully, parent exiting
[mongo@mysql ~]$ mongo
** WARNING: Access control is not enabled for the database.

2的问题就解决了,就剩下1的问题了,那个问题涉及到访问控制权限,待会解决

五、mongo语句

1、基本操作

查看有哪些数据库,和Mysql是一样的,不过所有操作都没有分号

> show databases
admin   0.000GB
config  0.000GB
local   0.000GB
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

查看当前在哪个库,是mysql里的-select database()

> db
test

切换数据库

> use local
switched to db local
> db
local

查看表

> show tables
startup_log

提问:
我们查看当前库是test,但是我们查看有哪些库是并没有出现test库,这是什么原因呢?

test登录时默认存在的库,可以理解为是隐藏的库
admin库系统预留库,mongoDB系统管理库
local库本地预留库,存储关键日志
config库mongoDB配置信息库

帮助命令

help  显示帮助
db.help()  可以查看当前库有哪些用法:例如:
 db.stats()可以查看当前库的状态
{
        "db" : "test",
        "collections" : 0,
        "views" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "fileSize" : 0,
        "fsUsedSize" : 0,
        "fsTotalSize" : 0,
        "ok" : 1
}

2、curd

所谓的curd就是create(创建),read(读取),update(更新),delete(删除)

2.1、插入数据-单行插入

给一个不存在的表插入数据,不需要先创建,直接插入命令即可,但是这个表就存在于你当前的库之下


> db
test
> db.dba.insert({"name":"liyu","age":24,"ad":"陕西西安"})
WriteResult({ "nInserted" : 1 })
> db.test.insert({"name":"zhangsan","age":25,"ad":"陕西西安","sex":"man"})
WriteResult({ "nInserted" : 1 })

查询数据,在当前库的test表里查询数据

> db
dba
> show tables
test
> db.test.find()
{ "_id" : ObjectId("6256a593dd6162f89edebf31"), "name" : "zhangsan", "age" : 25, "ad" : "陕西西安" }
{ "_id" : ObjectId("6256a5dedd6162f89edebf32"), "name" : "zhangsan", "age" : 25, "ad" : "陕西西安", "sex" : "man" }

可以看到这个表里可以允许不同的字段存在

2.2、插入数据-多行插入

db.inventory.insertMany([
	{"item":"journal","qty":25,"size":{"h":14,"w":21,"uom":"cm"},"status":"A"},
	{"item":"netbook","qty":50,"size":{"h":8.5,"w":11,"uom":"in"},"status":"A"},
	{"item":"paper","qty":100,"size":{"h":8.5,"w":11,"uom":"in"},"status":"D"}
	]);
> db.inventory.find()
{ "_id" : ObjectId("6256c56f4313c85b6ba36855"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("6256c56f4313c85b6ba36856"), "item" : "netbook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
{ "_id" : ObjectId("6256c56f4313c85b6ba36857"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }

2.3、查询语句

1、查询所有数据

> db.test.find()
{ "_id" : ObjectId("6256a593dd6162f89edebf31"), "name" : "zhangsan", "age" : 25, "ad" : "陕西西安" }
{ "_id" : ObjectId("6256a5dedd6162f89edebf32"), "name" : "zhangsan", "age" : 25, "ad" : "陕西西安", "sex" : "man" }

2、查询单条数据

> db.test.findOne()
{
        "_id" : ObjectId("6256a593dd6162f89edebf31"),
        "name" : "zhangsan",
        "age" : 25,
        "ad" : "陕西西安"
}

3、条件查询

> db.inventory.find({"status":"D"})
{ "_id" : ObjectId("6256c56f4313c85b6ba36857"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }

> db.inventory.find({"size.uom":"in"})
{ "_id" : ObjectId("6256c56f4313c85b6ba36856"), "item" : "netbook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
{ "_id" : ObjectId("6256c56f4313c85b6ba36857"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }

举例:and

> db.inventory.find({"size.uom":"in","qty":{$lt:60}})
{ "_id" : ObjectId("6256c56f4313c85b6ba36856"), "item" : "netbook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
lt表示小于,这里找的是size.uom是in的,并且qty小于60的数据

举例:or

> db.inventory.find({$or:[{"status":"D"},{"qty":{$lt:30}}]})
{ "_id" : ObjectId("6256c56f4313c85b6ba36855"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("6256c56f4313c85b6ba36857"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }

举例:又有and,又有or

> db.inventory.find({status:"A",$or:[{qty:{$lt:230}},{item:/^n/}]})
{ "_id" : ObjectId("6256c56f4313c85b6ba36855"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("6256c56f4313c85b6ba36856"), "item" : "netbook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }

3、更新数据

更新单条语句
更新前的内容

> db.inventory.find({"item":"paper"})
{ "_id" : ObjectId("6256c56f4313c85b6ba36857"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }

更新的语句

>db.inventory.updateOne({"item":"paper"},{$set:{"size.uom":"cm","status":"P"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
{"item":"paper"}是更新的条件,依据哪条信息更新?
{$set:{"size.uom":"cm","status":"P"}})是更新的内容,将uom更新为cm,将status更新为P

更新后的内容

> db.inventory.find({"item":"paper"})
{ "_id" : ObjectId("6256c56f4313c85b6ba36857"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "cm" }, "status" : "P" }

更新多条语句
更新前的内容

> db.inventory.find({"qty":{$lt:60}})
{ "_id" : ObjectId("6256c56f4313c85b6ba36855"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("6256c56f4313c85b6ba36856"), "item" : "netbook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }

更新的语句

> db.inventory.updateMany({"qty":{$lt:60}},{$set:{"size.uom":"cm","status":"P"}$currentDate:{"lastModified":true}})
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }

更新后的内容

> db.inventory.find({"qty":{$lt:60}})
{ "_id" : ObjectId("6256c56f4313c85b6ba36855"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "P", "lastModified" : ISODate("2022-05-11T07:22:55.382Z") }
{ "_id" : ObjectId("6256c56f4313c85b6ba36856"), "item" : "netbook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "cm" }, "status" : "P", "lastModified" : ISODate("2022-05-11T07:22:55.382Z") }

4、删除数据

删除单条数据

> db.inventory.deleteOne({"item":"paper"})
{ "acknowledged" : true, "deletedCount" : 1 }
> db.inventory.find()
{ "_id" : ObjectId("6256c56f4313c85b6ba36855"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "P", "lastModified" : ISODate("2022-05-11T07:22:55.382Z") }
{ "_id" : ObjectId("6256c56f4313c85b6ba36856"), "item" : "netbook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "cm" }, "status" : "P", "lastModified" : ISODate("2022-05-11T07:22:55.382Z") }
> db.inventory.find({"item":"paper"})
>

删除多条将deleteOne改为deleteMany既可

5、条件操作符

下图是mongo语句和sql语句的对比
在这里插入图片描述

6、type操作符

type所对应的数字
在这里插入图片描述
查找sex类型为布尔类型的数据
在这里插入图片描述

7、高级条件操作符

1、匹配列表中的某个值:$ in
2、值不匹配列表中的所有值:$ nin
3、判断域(字段)是否存在:$ exists
4、正则表达式实现like模糊查找:$ regex

下图是mongo与sql语句的对比
在这里插入图片描述

8、mongo投影

意思是只选择必要的数据,而不是选择整个文件的数据,类似于mysql中的select xx from xx where xx
mongo的用法如下:

db.tableName.find({where},{select})
如果没有where,语法为db.tableName.find({},{select})
在这里插入图片描述

9、mongo limit/skip限制记录

1、limit()方法

db.tableName.find().limit(number)  每页显示几条数据

2、skip()方法

db.tableName.find().limit(number).skip(number)

类似于mysql中的 limit start length的用法,意为跳过多少条数据之后,再每页显示多少条数据

10、mongo排序

在这里插入图片描述

11、mongo索引

1、创建索引
索引能够极大的提高查询的效率,mongo使用ensureIndex()方法来创建索引,其基本语法格式如下:

db.tableName.ensureIndex({key:1})

key值为要创建的索引字段,1为指定按升序创建索引,-1为降序创建索引。
2、查询索引

db.tableName.getIndexes()

3、删除索引

db.tableName.dorpIndex({index_nme)

12、MongoDB聚合

在这里插入图片描述
以下为聚合的表达式
在这里插入图片描述
MongoDB与MySQL的聚合对比
在这里插入图片描述

六、mongo工具使用

我们使用mongo时,tab键可以tab出很多mongo的命令

[mongo@mysql root]$ mongo
mongo         mongodump     mongofiles    mongoperf     mongorestore  mongostat
mongod        mongoexport   mongoimport   mongoreplay   mongos        mongotop

1、mongod是mongodb系统的主要守护进程,处理数据请求,管理数据访问,并执行后台管理操作。启动进程指定配置文件,控制数据库的行为。
2、mongos是对于mongo分片用的。是用于处理来自应用层的查询的mongo db分片配置的路由服务,并确定此数据在分片集群中的位置,以完成这些操作。从应用程序的角度来看,一个mongos实例与任何其他mongodb实例的行为相同。
3、mongostat可以快速概览当前正在运行的mongod或mongos实例的状态
4、mongotop提供了一种跟踪mongodb实例读取和写入数据的时间量的方法

3和4属于Mongo分析工具

七、mongo授权认证

用户授权认证

> use admin
switched to db admin
> db
admin
> show tables
system.version
> db
admin
> db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]})
Successfully added user: {
        "user" : "admin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}

修改配置文件

给下列文件添加以下两行
vim /opt/mongo_cluster/mongo_27017/conf/mongodb.conf
security:
  authorization: enabled

重启服务

mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf --shutdown
mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf

重新登录

[mongo@mysql root]$ mongo -u admin -p123456

授权myTester用户,给两个不同的库,这个用户对两个库拥有不同的权限,库test可读可写,库test2只可读。

db.createUser({user:"myTester",pwd:"123456",roles:[{role:"readWrite",db:"test"},{role:"read",db:"test2"}]})
Successfully added user: {
        "user" : "myTester",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "test"
                },
                {
                        "role" : "read",
                        "db" : "test2"
                }
        ]
}

用以下语句进行登录

[mongo@mysql root]$ mongo -umyTester -p123456 mysql:27017/test

八、mongo数据备份与恢复

1、数据备份
在这里插入图片描述
2、数据恢复
mongodb使用mongorestore命令来恢复备份的数据,其命令脚本语法如下:

mongorestore -h dbhost -d dbname dbdirectory

参数解释:
在这里插入图片描述

九、使用pymongo操作MongoDB

首先安装pymongo库

pip install pymongo

获取客户端

import pymongo
#1、创建客户端---方式1
client=pymongo.MongoClient(host='192.168.119.180',port=27017,username='root',password='13456')
#2、创建客户端---方式2
uri="mongodb://%s:$s@%s:%d"%("root","123456","192.168.119.180",27017)
client=pymongo.MongoClient(uri)

对数据库的操作

import pymongo
#创建客户端
client=pymongo.MongoClient(host='192.168.119.180',port=27017)
#创建数据库---方式1
db=client.user
print(db)
#创建数据库---方式2
db2=Database(client=client,name="user")
print(db2)

#展示所有数据库=show dbs
for name in client.list_database_names():
	print(name)
结果为:
admin
config
local
user
	
#删除数据库
client.drop_database("数据库名称")

对集合的操作

import pymongo
client=pymongo.MongoClient(host="192.168.119.180",port=27017)
#数据库
db=client.user
#集合
col=db.col
print(col)
结果为:
Collection(Database(MongoClient(host=['192.168.119.180:27017'], document_class=dict, tz_aware=False, connect=True), 'user'), 'col')

#展示所有集合=show tables
for coll in db.list_collections():
	print(coll)

#删除集合
db.drop_collections("表名称")

#集合插入单条数据
def test_insert():
    users=client.user.col
    r=users.insert_one({"name":"lisi","age":20,"sex":"男"})
    print(r)
    #操作状态,被插入后的_id值
    print(r.acknowledged,r.inserted_id)

if __name__ == '__main__':
    test_insert()
 结果为:
<pymongo.results.InsertOneResult object at 0x00000258590B9F98>
True 62b1a9571d4b1d5d5f0296de

插入多条数据

import pymongo
client=pymongo.MongoClient(host="192.168.119.180",port=27017)
#数据库
db=client.user
#集合
col=db.col
def test_insert():
    users=client.user.col
    #插入多条记录(文档)
    doc1={"name":"ww","age":100,"sex":"女"}
    doc2={"name":"lm","age":50,"sex":"男"}
    rs=users.insert_many([doc1,doc2],ordered=True)
    #被插入后的id值
    print(rs.acknowledged,rs.inserted_ids)
if __name__ == '__main__':
    test_insert()
 
结果为:
True [ObjectId('62b1b43e084f94f3540258bd'), ObjectId('62b1b43e084f94f3540258be')]

在遍历数据库和遍历集合的时候,会出现如下错误,出现错误的原因是身份认证失败,是因为Mongo没有配置用户及密码,解决方式为删除代码里的用户和密码即可。
在这里插入图片描述
删除单条数据

import pymongo
client=pymongo.MongoClient(host="192.168.119.180",port=27017)
#数据库
db=client.user
#集合
col=db.col
def test_delete():
    users=client.user.col
    r=users.delete_one({"name":"liyu"})
    print(r.acknowledged,r.deleted_count)
if __name__ == '__main__':
    test_delete()

结果为:
True  1

在虚拟机上,效果如下:
在这里插入图片描述
删除多条数据

import pymongo
client=pymongo.MongoClient(host="192.168.119.180",port=27017)
#数据库
db=client.user
#集合
col=db.col
def test_delete():
    users=client.user.col
    #删除多条数据
    r = users.delete_many({"name": "ww"})
    print(r.acknowledged, r.deleted_count)
if __name__ == '__main__':
    test_delete()

结果为:
True  3

在虚拟机上的Mongo上验证:
在这里插入图片描述
修改数据

import pymongo
client=pymongo.MongoClient(host="192.168.119.180",port=27017)
#数据库
db=client.user
#集合
col=db.col
def test_update():
    users=client.user.col
    r=users.update_one(filter={"name":"lisi"},update={"$set":{"age":34,"sex":"女"}})
    print(r.acknowledged, r.matched_count,r.modified_count,r.raw_result,r.upserted_id)
if __name__ == '__main__':
    test_update()

结果为:
True 1 1 {'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True} None

虚拟机上的效果如下:
在这里插入图片描述
修改多条数据将update_ine改为update_many即可。

十、pymongo查询

1、与或查询

与查询,查询book数据库里col表,鲁迅的文学作品

import pymongo
client=pymongo.MongoClient(host="192.168.119.180",port=27017)
db = client.book
col = db.col

mes=client.book.col
def show(rs):
    for r in rs:
        print(r)

#查找鲁迅的文学作品
def query_and():
    r=mes.find({"type":"文学","author":"鲁迅"})
    print(r)
    show(r)

if __name__ == '__main__':
    query_and()

结果如下:
在这里插入图片描述
或查询,查询鲁迅和老舍的书籍

def show(rs):
    for r in rs:
        print(r)
        
def query_or():
    r=mes.find({"$or":[{"author":"鲁迅"},{"author":"老舍"}]})
    show(r)

结果如下:
在这里插入图片描述
与或查询,查找鲁迅和老舍的文学作品

def query_and_or():
    r=mes.find({"type":"文学","$or":[{"author":"鲁迅"},{"author":"老舍"}]})
    show(r)

2、操作符查询

查找年龄小于30岁的

......
users=client.user.col
#查询年龄小于30的
def query_lt():
    r=users.find({"age":{"$lt":30}})
    show(r)

查找年龄在18到50岁之间

def query_qj():
    r=users.find({"age":{"$gt":18,"$lt":50}})
    show(r)

查找年龄为18,45,50的文档

def query_in():
    r=users.find({"age":{"$in":[18,45,50]}})
    show(r)

结果为:
在这里插入图片描述
like查询,查找姓名包含l的人

def query_like():
    r=users.find({"name":{"$regex":"l"}})
    show(r)

结果为:
在这里插入图片描述
查询以l开头的文档

def query_like():
    r=users.find({"name":{"$regex":"^l"}})
    show(r)

结果为:
在这里插入图片描述
同样,以l结束,换位l$即可

3、聚合

统计男生和女生中,年龄最小的文档

import pymongo
client=pymongo.MongoClient(host="192.168.119.180",port=27017)
db=client.user
col=db.col
users=client.user.col
def show(rs):
    for r in rs:
        print(r)

def agg_group():
    #根据性别,统计最小年龄
    pipeline=[
        {"$group":{"_id":"$sex","min_age":{"$min":"$age"}}}
    ]
    r1=users.aggregate(pipeline)
    show(r1)
if __name__ == '__main__':
    agg_group()

结果为:
在这里插入图片描述
统计各个性别的人数

def agg_sum():
    #根据性别,统计人数
    pipeline=[
        {"$group":{"_id":"$sex","count":{"$sum":1}}}
    ]
    r1=users.aggregate(pipeline)
    show(r1)

结果如下:
在这里插入图片描述
统计人数并排序
在这里插入图片描述
结果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值