0

0

利用pymongo操作mongoDB数据库

php中文网

php中文网

发布时间:2016-06-07 15:17:26

|

1758人浏览过

|

来源于php中文网

原创

利用pymongo操作mongoDB数据库 #连接数据库def get_db(): from pymongo import MongoClient client = MongoClient(localhost:27017) db = client.examples #examples here is the database name.it will be created if it does not exist. #如果 examples不

利用pymongo操作mongoDB数据库

#连接数据库

def get_db():

    from pymongo import MongoClient 
    
    client = MongoClient('localhost:27017')
    
    db = client.examples #'examples' here is the database name.it will be created if it does not exist.
    #如果 examples不存在,那么就会新建它
    return db
#插入操作
def add_city(db):

    db.cities.insert({'name':'Chicago'}) #inser 插入一个字典
#获取数据
def get_city(db):
    return db.cities.find_one()#从cities中返回任意一个数据
if __name__ == '__main__':
    db = get_db()
    add_city(db)
    print get_city(db)


上面只是操作mongoDB数据库的最简单的一个例子。


我们基于mongoDB的应用(APP),pymongo模块,与mongoDB数据库,三者之间是什么关系呢?


我觉得可以表示为:  APP pymongomongoDB    
                                                                     其中:BSON 为Binary Json
有了这个概念后,你就会理解为什么mongoDB是字典家族。


所以在mongoDB的操作中一定要建立一切皆为字典的基本认识。

步入正题,先说一下Query操作 query = {'manuafacturer':'Porsche'}

projection = {'_id':0,'name':1}#显示为1,不显示为0

db.myautos.find(query,projection)#查找制造商为保时捷的数据,但是不显示'_id',显示'name'

db.myautos.find(query,projection).count()#返回满足条件的数据的数量
从json文件导入数据库:
在terminal下:

$mongoimport -db dbname -c collectionname --file inputfile.json

比较操作符:

$gt                                     $lt                                     $lte                                   $gte                            $ne    分别对应为:

大于(greater than)      小于(less than)      小于等于(less than equal)     大于等于(greater than equal)     不等于(not equal)

query = {'population':{'$gt':10000}}  #人口大于10000

query = {'population':{'$gt':10000, '$lte':20000}} #人口大于10000小于等于20000

query = {'name':{'$gt':'X', '$lte':'Z'}}#name 头字母介于X Z之间

from datetime import datetime

query = {'foundationDate':{'$gt':datetime(1840,1,1), '$lte':datetime(2049,10,1)}}
#介于1840,1,1日和2049,10,1 的时间
存在操作符$exist
query = {'governmentType':{'$exist':1}} #1表示存在
query = {'governmentType':{'$exist':0}} #0表示不存在
正则表达式操作符$regex
query = {'motto':{'$regex':'[Ff]riendship'}}

$in 与 $all

query = {'modelYears':{'$in':[1965,1967,1977,1987]}}#只要存在一个就可以
query = {'modelYears':{'$all':[1965,1967,1977,1987]}}#四个必须全部同时存在

  如果数据结构为:

{'dimension':{'width':25,
              'height':30,
              'length':89}
 ........
 }

  Query 字典可以为:

query = {'dimension.width':25}

city = db.cities.find(query)

for ele in city:
    city['dimension'] = 66

#保存修改
db.cities.save(city)

update操作

db.cities.update({'name':'michael',
                  'country':'china'},#条件
                  {'$set':{'iso':1978}})#满足条件的条目中,有'iso'属性的,其值改为1978

db.cities.update({'name':'michael',
                  'country':'china'},#条件
                  {'$unset':{'iso':1978}}) #满足条件的条目中,有'iso'属性的,删除'iso'属性 
#多个修改
db.cities.update({'name':'michael',
                  'country':'china'},#条件
                  {'$set':{'iso':1978}}, multi = True)

    aggregate操作

我们考虑如下的数据结构:

{
    "_id" : ObjectId("5304e2e3cc9e684aa98bef97"),
    "text" : "First week of school is over :P",
    "in_reply_to_status_id" : null,
    "retweet_count" : null,
    "contributors" : null,
    "created_at" : "Thu Sep 02 18:11:25 +0000 2010",
    "geo" : null,
    "source" : "web",
    "coordinates" : null,
    "in_reply_to_screen_name" : null,
    "truncated" : false,
    "entities" : {
        "user_mentions" : [ ],
        "urls" : [ ],
        "hashtags" : [ ]
    },
    "retweeted" : false,
    "place" : null,
    "user" : {
        "friends_count" : 145,
        "profile_sidebar_fill_color" : "E5507E",
        "location" : "Ireland :)",
        "verified" : false,
        "follow_request_sent" : null,
        "favourites_count" : 1,
        "profile_sidebar_border_color" : "CC3366",
        "profile_image_url" : "http://a1.twimg.com/profile_images/1107778717/phpkHoxzmAM_normal.jpg",
        "geo_enabled" : false,
        "created_at" : "Sun May 03 19:51:04 +0000 2009",
        "description" : "",
        "time_zone" : null,
        "url" : null,
        "screen_name" : "Catherinemull",
        "notifications" : null,
        "profile_background_color" : "FF6699",
        "listed_count" : 77,
        "lang" : "en",
        "profile_background_image_url" : "http://a3.twimg.com/profile_background_images/138228501/149174881-8cd806890274b828ed56598091c84e71_4c6fd4d8-full.jpg",
        "statuses_count" : 2475,
        "following" : null,
        "profile_text_color" : "362720",
        "protected" : false,
        "show_all_inline_media" : false,
        "profile_background_tile" : true,
        "name" : "Catherine Mullane",
        "contributors_enabled" : false,
        "profile_link_color" : "B40B43",
        "followers_count" : 169,
        "id" : 37486277,
        "profile_use_background_image" : true,
        "utc_offset" : null
    },
    "favorited" : false,
    "in_reply_to_user_id" : null,
    "id" : NumberLong("22819398300")
}

$group 操作

group = {'$group':{'_id':'$user.screen_name','count':{'$sum':1}}}

#group操作必须有个键是'_id'表示操作的对象,'$sum'表示求和操作

#上面这一行代码的意思是,统计各个'user.screen_name'的个数

 $sort 操作,顾名思义,排序操作,其对某个键值进行升序或是降序操作

#接上段代码
sort = {'$sort:{'count':-1}} #按照'count'对应的值得降序排序

   将group,sort整合到aggregate函数中,就能得到我们想要的结果

pipeline = [group,sort]
result = db.tweets.aggregate(pipeline)
#result 是一个字典。result['result'] 包含处理好的数据的列表
#整个操作就是,统计各个user.screen_name的数量,并倒序排列

   上面仅仅是最简单的例子

下面我们继续讨论其他操作:

$match ,顾名思义,我更愿意叫他“过滤器” 

好吧让我举个例子,我想找出数据库中谁的人气最旺!你给我个建议,怎么找到这个逗比?

¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥好好想想¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

¥¥¥¥¥¥¥¥¥¥¥¥¥是国民老公,王思聪¥¥¥¥¥¥¥¥¥¥¥¥¥还是,臭脚,杨幂¥¥¥¥¥¥¥¥¥

¥¥¥¥¥¥¥¥¥是某个微博卖肉的小明星?¥¥¥¥¥¥¥还是传媒达人,谷大白话?¥¥¥¥¥¥¥¥¥¥¥¥

好吧,我只想到了个比值,用比值表示,是比值,不是逼值

比值 = 粉丝数/好友数 

当然,关注数也还行,可我就是这么任性,像姜文大叔一样,怎么滴?

奥,你说,你要这样我不看了啦!

好!你不看就不看吧,小弟看了姜文大叔的电影,学了一个本事儿。

我悄悄告诉你:姜文的意思是:我拍电影不是给你看的,我是给自己看的。小弟不才,没钱拍电影,》》写博客不是给别人看的,是给自己看的。对!我在自言自语。另一个我在看博客。

扯回来$match ,不,扯回来找比值,看看我怎么找比值吧,不,是最大比值

match = {'$match':{'user.friends_count':{'$gt':0},'user.followers_count':{'$gt':0}}}
#确保 好友数和粉丝数都是正数
project = {'$project':{'ratio':{'$divide':['$user.followers_count','$user.friends_count']},
                        'screen_name':'$user.screen_name'}}
#创建'ratio'和'screen_name'两个键值,其中,'ratio'利用了'$divide'除法,对两个变量进行除法操作,当然,
#这个列表有先后顺序
#下面进行排序
sort = {'$sort':{'ratio':-1}} #降序排列
#选取第一位
limit = {'$limit':1}
#$limit 限制选择结果的个数

pipeline = [match, project, sort, limit]
result = db.tweets.aggregate(pipeline)

  $unwind 操作, 举例如下:

假设有这样的字典结构:

{
	'id':'1',
	'author':'jone',
	'tags':['good','fun','good']
}
进行db.article.aggregate操作

db.article.aggregate([{'$prject':{'author':1,'tags':1}},{'$unwind':'tags'}])
结果为:

{'result':[{'_id':'XXXX','author':'jone','tags':'good'},
           {'_id':'XXXX','author':'jone','tags':'fun'},
           {'_id':'XXXX','author':'jone','tags':'good'}],
 'ok':1}
所以$unwind操作的操作对象是数组,如果不是数组会报错。他的作用就是将数组中的每个元素代替数组本身,最后产生多个item,新产生的item的数目自然就是

原来数组的长度。


$group操作

我们考虑最开始的twitter数据,如果我要找到哪一个微博文本被转发的平均次数最多,该如何写我们的aggregate呢?

首先要找到推文的hashtag,这里补充一下,上文中的twitter数据中的

"entities" : {
        "user_mentions" : [ ],
        "urls" : [ ],
        "hashtags" : [ ]
结构中,‘entiyies.hashtags’是个列表。所以我们可以进行$unwind操作

而’retweet_count‘标明了被转发的次数,进行平均计算就可以了。

 unwind = {'$unwind':'$entities.hashtags'}
 group = {'$group':{'_id':'entities.hashtags.text','retweet_avg':{'$avg':'$retweet_avg'}}}
注意:$group操作必须有'_id'属性,其次
'entities.hashtags.text'
还可以是自己起的名字,如’txt‘。’$avg‘是进行求平均值操作。类似的还有:

'$sum'    '$first'   '$last'   '$max' '$min'    等

接着进行排序操作,这样所有操作就是如下:

明日B2C电子商务系统源码
明日B2C电子商务系统源码

对于典型的数据库管理系统,尤其是B2C电子商务网站这样数据流量比较大的网络管理系统,必须要满足使用方便、操作灵活等设计需求。

下载

unwind = {'$unwind':'$entities.hashtags'}
group = {'$group':{'_id':'$entities.hashtags.text','retweet_avg':{'$avg':'$retweet_avg'}}}
sort = {'$sort':{'retweet_avg':-1}}
limit = {'$limit':1}
pipeLine = [unwind,group,sort,limit]
db.article.aggregate(pipeLine)
毛主席教导的好,有矛就有盾,既有$unwind拆分数组,就收神器组成数组。你猜他会是什么呢?

$push,   $addToSet

顾名思义,push和addToSet都是将元素组合到数组中,但是addToSet更加高级,Set是集合,所以addToSet形成的数组中没有重复元素。

push形成的数组中是可以有重复元素的。

这就是二者的不同之处。


好了,利用pymongo处理mongoDB是不是很简单呢?大家都这么说哒。

我也觉得不难啦。







热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.8万人学习

CSS3 教程
CSS3 教程

共18课时 | 5万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号