一文带你深入浅出 MongoEngine 经典查询【内附详细案例】

本文主要是介绍一文带你深入浅出 MongoEngine 经典查询【内附详细案例】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、 查询数据库(所有)
  • 二、 过滤查询(单个、条件)
    • 1. 查单个
    • 2. 可用的过滤查询运算符
    • 3. 过滤查询运算符使用示范
  • 三、字符串查询(模糊)
    • 1. 可用的模糊查询运算符
    • 2. 模糊查询运算符使用示范
  • 四、原始查询 ( _ _ raw _ _ )
    • 1. 原始查询详解
    • 2. 原始查询示例
  • 五、排序 / 排序结果( +、- )
  • 六、限制和跳过结果( [ ]、first() )
  • 七、聚合查询
    • 1. 求和
    • 2. 求平均值
    • 3. 计数
    • 4. 求频率
  • 总结

前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

一、 查询数据库(所有)

  • 在MongoEngine中,要查询 MongoDB 数据库中的所有文档,你可以使用模型的 objects 属性并选择性调用 all() 方法
books = Books.objects
books2 =  Books.objects.all()

在这里插入图片描述

  • Document 类有一个 objects 属性,用于访问与类关联的数据库中的对象。该 objects 属性实际上是一个 QuerySetManager,它在访问时创建并返回一个新 QuerySet 对象。可以迭代该 QuerySet 对象以从数据库中获取文档:
for book in Books.objects:print (book.bookName)

在这里插入图片描述

二、 过滤查询(单个、条件)

1. 查单个

在 MongoEngine 中,要查询单个文档,你可以使用 first() 方法或 get() 方法,具体取决于你的需求和查询条件。

1. 使用 first() 方法来查询第一个符合条件的文档

# 查询第一个 brand 字段名称为 rmzxb 的报纸
books = Books.objects(brand='rmzxb').first()

在这里插入图片描述

2. 使用 get() 方法来查询符合条件的唯一文档(如果存在)

  • 要检索集合中应唯一的结果,请使用 get() 。如果没有与查询匹配的文档,并且 MultipleObjectsReturned 有多个文档与查询匹配,则会引发 DoesNotExist 此值。这些异常将合并到您的文档定义中,例如:MyDoc.DoesNotExists

  • 这种方法的变体get_or_create()存在,但它不安全。它不能被安全,因为mongoDB中没有事务。应调查其他方法,以确保在使用与此方法类似的方法时不会意外复制数据。因此,它在 0.8 中被弃用,在 0.10 中被删除。

  • 查询成功示例

# 查询符合条件的唯一文档(如果存在)
books = Books.objects.get(isbn='4754959145206026241')

在这里插入图片描述

  • 查询失败示例
# 查询符合条件的唯一文档(如果存在)
books = Books.objects.get(brand='rmzxb')

在这里插入图片描述

2. 可用的过滤查询运算符

作用符号表示英文全称
不等于nenot equal to
小于ltless than
小于或等于lteless than or equal to
大于gtgreater than
大于或等于gtegreater than or equal to
否定标准检查,可以在其他运算符之前使用,例如查询年龄不是5的倍数的文档:Q (age_ not _mod=(5, 0))not
值在列表中(应提供值列表)in
值不在列表中(应提供值列表)nin
查询年龄字段满足模数条件的文档,例如,年龄除以5的余数等于1的文档result = Person.objects(age_ _mod=(5, 1))mod
提供的值列表中的每个项目都在数组中,例如使用 all 方法查询包含所有指定兴趣爱好的人员 people = Person.objects(hobbies_ _all=hobbies)all
数组的大小,例如使用 size 方法查询具有特定数量兴趣爱好的人员 count = Person.objects(hobbies_ _size=hobby)size
字段值存在,例如 使用 exists() 方法查询包含 name 字段的文档people_with_name = Person.objects(name_ _exists=True)exists

3. 过滤查询运算符使用示范

  • 查询日期小于 2023-05-25 的报纸
presentPublishDate = '2023-05-25T00:00:00.000+00:00'
book = Books.objects(publishDate__exists=True, publishDate__lt=presentPublishDate)

在这里插入图片描述

  • 查询 isbn 在列表中的报纸
isbns = ['4759307800083959809','4760032575949377537']
book = Books.objects(isbn__in=isbns)

在这里插入图片描述

三、字符串查询(模糊)

1. 可用的模糊查询运算符

作用字符表示
字符串字段完全匹配值exact
字符串字段完全匹配值(不区分大小写)iexact
字符串字段包含值contains
字符串字段包含值(不区分大小写)icontains
字符串字段以值开头startswith
字符串字段以值开头(不区分大小写)istartswith
字符串字段以值结尾endswith
字符串字段以值结尾(不区分大小写)iendswith
字符串字段包含整个单词wholeword
字符串字段包含整个单词(不区分大小写)iwholeword
正则表达式的字符串字段匹配regex
正则表达式的字符串字段匹配(不区分大小写)iregex
执行$elemMatch,以便您可以匹配数组中的整个文档match

2. 模糊查询运算符使用示范

  • 查询文章标题包含指定字符串的报纸
title_input = '回信勉励海军'
article = Cards.objects(title__contains=title_input).first()

四、原始查询 ( _ _ raw _ _ )

1. 原始查询详解

  • 在 MongoEngine 中,你可以使用原始查询来执行 MongoDB 查询语句,这允许你直接发送 MongoDB 查询命令而不受 MongoEngine API 的限制。原始查询在需要执行复杂的或特殊的查询时非常有用,因为它们允许你直接编写 MongoDB 查询语句。

  • 可以提供原始 PyMongo 查询作为查询参数,该参数将直接集成到查询中。这是使用 raw 关键字参数完成的:

  Page.objects(__raw__={'tags': 'coding'})
  • 同样,可以为该方法 update() 提供原始更新:
  Page.objects(tags='coding').update(__raw__={'$set': {'tags': 'coding'}})
  • 而两者也可以结合起来:
  Page.objects(__raw__={'tags': 'coding'}).update(__raw__={'$set': {'tags': 'coding'}})
  • 请注意,原始查询允许你执行复杂的查询,但也需要小心使用,因为它们绕过了 MongoEngine 的对象映射和验证。确保你的原始查询语句正确且安全,以避免潜在的安全问题。

2. 原始查询示例

  • 查询 id 在指定范围内并且 snapshots 字段值不为 0 的报纸
book_ids = [13586,13849,13871]
sm = {'_id': {'$in': book_ids}, 'snapshots.0': {'$exists': True}}
docs: Books = Books.objects(__raw__=sm)

在这里插入图片描述

五、排序 / 排序结果( +、- )

可以使用 按 order_by() 1 个或多个键对结果进行排序。可以通过在每个键前面加上“+”或“-”来指定顺序。如果没有前缀,则假定按升序排列。

# Order by ascending date
blogs = BlogPost.objects().order_by('date')    # equivalent to .order_by('+date')# Order by ascending date first, then descending title
blogs = BlogPost.objects().order_by('+date', '-title')

六、限制和跳过结果( [ ]、first() )

  • 与传统 ORM 一样,我们可以限制返回的结果数量或跳过查询中的数字或结果。 limit() 和 skip() 方法在对象上 QuerySet 可用,但数组切片语法是实现此目的的首选:
# Only the first 5 people
users = User.objects[:5]# All except for the first 5 people
users = User.objects[5:]# 5 users, starting from the 11th user found
users = User.objects[10:15]
  • 还可以为查询编制索引以检索单个结果。如果该索引中的项目不存在,则将引发 。 IndexError 提供了检索第一个结果并在不存在结果时返回 None 的快捷方式 ( first() ):
# Make sure there are no users
>>>User.drop_collection()
>>>User.objects[0]
IndexError: list index out of range
>>>User.objects.first() == None
True
>>>User(name='Test User').save()
>>>User.objects[0] == User.objects.first()
True

七、聚合查询

1. 求和

  • 我们可以使用以下命令对 sum() 文档上特定字段的值求和:
  yearly_expense = Employee.objects.sum('salary')
  • 如果文档中不存在该字段,则该文档将从总和中忽略。

2. 求平均值

  • 要获取文档集合上字段的平均值,请使用 average() :
  mean_age = User.objects.average('age')

3. 计数

  • 就像限制和跳过结果一样, QuerySet 对象上有一个方法 – count() :
  num_users = User.objects.count()
  • 从技术上讲,我们可以使用 来 len(User.objects) 获得相同的结果,但它会比 慢 count() 得多。当您执行服务器端计数查询时,您让MongoDB完成繁重的工作,并通过网络接收单个整数。同时,检索所有结果,将它们放在本地缓存中, len() 最后对它们进行计数。如果我们比较这两个操作的性能, len() 比 慢得多 count()

  • 示例

book_ids = [13586,13849,13871]
sm = {'_id': {'$in': book_ids}, 'snapshots.0': {'$exists': True}}
count = client.get_db()['books'].count(sm)

在这里插入图片描述

4. 求频率

由于MongoDB提供本机列表,MongoEngine提供了一个辅助方法来获取整个集合中列表中项目频率的字典 - item_frequencies() 。它的使用示例是生成“标签云”:

class Article(Document):tag = ListField(StringField())# After adding some tagged articles...
tag_freqs = Article.objects.item_frequencies('tag', normalize=True)from operator import itemgetter
top_tags = sorted(tag_freqs.items(), key=itemgetter(1), reverse=True)[:10]

总结

欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

这篇关于一文带你深入浅出 MongoEngine 经典查询【内附详细案例】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/170930

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

ural 1026. Questions and Answers 查询

1026. Questions and Answers Time limit: 2.0 second Memory limit: 64 MB Background The database of the Pentagon contains a top-secret information. We don’t know what the information is — you

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>