iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MongoDB高级语法
  • 529
分享到

MongoDB高级语法

2024-04-02 19:04:59 529人浏览 泡泡鱼
摘要

and操作:    隐式and操作:        db.getCollection("the_table").find({"age":{"$gt":20},"sex":"男"})   //对age与sex

and操作:

    隐式and操作:

        db.getCollection("the_table").find({"age":{"$gt":20},"sex":"男"})   //对age与sex这两个字段的查询条件需要同时满足

    显式and操作:

        db.getCollection("the_table").find({"$and":[{"age":{"$gte":20}},{"address":"里世界"}]})

    显式、隐式混用:

        db.getCollection("the_table").find({
            "id":{"$lt": 10},
            "$and": [{"age": {"$gt": 20}}, {"sex": "男"}]
        })

    不能写成隐式and操作的例子:

        db.getCollection("the_table").find({
            "$and": [
                {"$or": [{"age": {"$gt": 28}}, {"salary": {"$gt": 9900}}]},
                {"$or": [{"sex": "男"}, {"id": {"$lt": 20}}]}
            ]
        })

or操作:

    年龄大于28,或工资大于9900的:

        db.getCollection("the_table").find({
            "$or": [{"age": {"$gt": 28}},{"salary":{"$gt": 9900}}]
        })

    (注意:mongodb在执行or操作时会遵循一个"短路原则":只要前面的条件满足了,那后面的条件直接跳过。如果age大于28 ,那就不需要去检查salary的值是多少。只有在age不满足查询条件时,才会去检查salary的值)

    OR操作一定是显式的,不存在隐式的OR操作

    而这里去可以把or两边的都显示出来:

        > db.getCollection("the_table").find()
        ......
        { "_id" : ObjectId("5d10400adc4728bc5f52f3ca"), "username" : "张三" }
        { "_id" : ObjectId("5d104011dc4728bc5f52f3cb"), "username" : "李四" }
        > db.getCollection("the_table").find({"$or":[{"username":"张三"},{"username":"李四"}]})
        { "_id" : ObjectId("5d10400adc4728bc5f52f3ca"), "username" : "张三" }
        { "_id" : ObjectId("5d104011dc4728bc5f52f3cb"), "username" : "李四" }
        >



嵌入式文档的查询:

    MongoDB高级语法

    嵌入字段只是定位的时候多了一步。除此之外,嵌入字段和普通字段没有区别。

    查询所有followed大于10的数据:

        db.getCollection("the_table").find({"user.followed": {"$gt": 10}})

    如需要在返回的查询结果中只显示嵌入式文档中的部分内容,也可以使用点号来实现。例如只返回"name"和"user_id"这两个字段,查询语句:

        db.getCollection("the_table").find(
            {"user.followed": {"$gt": 10}},
            {"_id": 0, "user.name": 1, "user.user_id": 1}
        )

   


包含与不包含:

    查出所有size包含M的数据:

        db.getCollection("the_table").find({"size": "M"})

        MongoDB高级语法

    查出所有size不包含M的数据:

        db.getCollection("the_table").find({"size": {"$ne": "M"}})

        MongoDB高级语法

    数组中有元素在另一个范围空间内:

        db.getCollection("the_table").find({"price": {"$lt": 300, "$gt": 200}}



数组应用:

    根据数组长度查询数据:

        从数据集the_table中查询所有price长度为2的记录:

            db.getCollection("the_table").find({"price": {"$size": 2}})

            MongoDB高级语法

    根据索引查询数据(索引是从0 开始的)

        查询所有“ size ”的第1个(索引为0)数据为“ S ”的记录,查询语句为:

            db.getCollection("the_table").find({"size.0": "S"})

            MongoDB高级语法

        使用索引也可以比较大小。例如,查询“price ”第1 个数据大于500 的所有记录:

            db.getCollection("the_table").find({"price.0": {"$gt": 500}})

            MongoDB高级语法



高级更新:

    最好用$push或$addToSet,这两个命令都是往数组中添加数据,但$addToSet是唯一的,阻止了重复数据

        db.getCollection("the_table").update(
            {"favorites.movies": "Cassablanca"},
            {"$addToSet": {"favorites.movies": "the maltese falcon"}},
            false,
            true
        )

        第一个参数:匹配电影列表中包含Cassablanca的用户

        第二个参数:使用$addToSet添加the maltese falcon到列表中

        第三个参数:false,控制是否允许upsert。这个命令告诉更新操作,当一个文档不存在的时候是否插入它,这取决于更新操作是操作符更新还是替换更新

        第四个参数:true,表示是否更新多个更新。默认情况下,mongoDB更新只针对第一个匹配文档。如果想更新所有匹配文档,就必须显示指定这个参数。


删除数据:

    db.user.remove({"favorites.cities":"Cheyenne"})

    注意:remove()操作不会删除集合,它只会删除集合中的某个文档。我们可以把它和sql中的delete命令类比。如果要删除集合以及附带的索引数据,可以用drop()方法:

    db.user.drop()


MongoDB的聚合查询:

    使用聚合功能,可以直接让MonGoDB来处理数据。聚合功能可以把数据像放入传送带一样,先把原始数据按照一定的规则进行筛选处理,然后通过多个不同的数据处理阶段来处理数据,最终输出一个汇总的结果。

    聚合操作的命令为"aggregate",基本格式为:collection.aggregate([阶段1,阶段2,阶段3, ……,阶段N])

    聚合操作可以有0 个、l 个或者多个阶段。如果有0 个阶段,则查询命令写为:collection.aggregate()。那么它的作用和collection.find() 一样

    如果聚合有至少一个阶段,那么每一个阶段都是一个字典。不同的阶段负责不同的事情,每一个阶段有一个关键字。有专门负责筛选数据的阶段“ $match ’3 ,有专门负责宇段相关的阶段“ $pr句ect”,有专门负责数据分组的阶段“$group"等。聚合操作有几十个不同的阶段关键字

    一般情况下,并非所有的数据都需要被处理,因此大多数时候聚合的第一个阶段是数据筛选。就像find()一样,把某些满足条件的数据选出来以便后面做进一步处理。数据筛选的关键字为$match,它的用法为:collection.aggregate([{"$match":{和find 完全一样的查询表达式}}])


        从the_table数据集中,查询age大于等于27,且sex为“女”的所有记录:

            db.getCollection("the_table").aggregate([
                {"$match": {"age": {"$gte": 27}, "sex": "女"}}
            ])

        从查询结果来看,这一条聚合查询语句的作用完全等同于:
            db.getCollection("the_table").find({"age": {"$gte": 27}, "sex": "女"})

        这两种写法,核心查询语句{"age": {"$gte": 27} , "sex":"女"}完全一样。聚合查询操作中的{"$match":{和find完全一样的查询表达式}}","$match"作为一个字典的Key,字典的Value和"find()"第1个参数完全相同。"find()"第1个参数能怎么写,这里就能怎么写。

        例如,查询所有age大于28或sex为男的记录,聚合查询可以写为:

            db.getCollection("the_table").aggregate([
                {"$match": {"$or": [{"age": {"$gt": 28}}, {"sex": "男"}]}}
            ])

        从效果上看,使用聚合查询与直接使用“自nd()” 效果完全相同,而使用聚合查询还要多敲几次键盘,那它的好处在哪里呢?聚合操作的好处在于“ 组合” 。接下来会讲到更多的聚合关键字,把这些关键字组合起来才能体现出聚合操作的强大。


    筛选与修改字段:

        $project来实现一个己经有的功能一一只返回部分字段(这里的字段过滤语句与find()第2个参数完全相同)

            db.getCollection("the_table").aggregate([
                {"$project": {"_id":0, "sex":1, "age":1}}
            ])

    先筛选记录,再过滤字段:

        db.getCollection("the_table").aggregate([

            {"$match": {"age": {"$gt": 28}}}

            {"$project": {"_id":0, "sex":1, "age":1}},
        ])


    添加新字段:

        db.getCollection("the_table").aggregate([
            {"$project": {"_id":0, "sex":1, "age":1, "newfield": "hello world"}},
            {"$match": {"age": {"$gt": 28}}}
        ])

        MongoDB高级语法

        (newfield是原来没有的字段)

    

    复制现有字段:

        db.getCollection("the_table").aggregate([
            {"$match": {"age": {"$gt": 28}}},
            {"$project": {"_id":0, "sex":1, "age":1, "newfield": "$age"}}
        ])

        MongoDB高级语法

        

    修改现有字段的数据:

        db.getCollection("the_table").aggregate([
            {"$match": {"age": {"$gt": 28}}},
            {"$project": {"_id":0, "sex":1, "age":1, "newfield": "this is new field"}}
        ])

        MongoDB高级语法


    注意:这并不会改变数据库里的数据,只是改变输出的数据

        MongoDB高级语法

        (数据并没有变化)


    抽取嵌套字段:

        上面的:添加新字段、复制现有字段、修改现有字段的数据等,看起来并没有卵用,而下面的例子就有用了:

            如果用find(),想返回user_id和name,则查询语句为:

                db.getCollection("the_table").find({},{"user.name":1, "user.user_id":1})

            返回结果为:

                MongoDB高级语法

                (显然,嵌套字段处理起来并不方便)

            现在用$project将嵌套字段中的内容抽取:

                db.getCollection("the_table").aggregate([
                    {"$project": {"name":"$user.name", "user_id":"$user.user_id"}}
                ])

                MongoDB高级语法


    处理字段特殊值:

        • 如果想添加一个字段,但是这个字段的值就是数字“ 1 ”会怎么样?
        • 如果添加一个字段,这个字段的值就是一个普通的字符串,但不巧正好以“$”开头,又会怎么样呢?

        关键字:$literal

        db.getCollection("the_table").aggregate([
            {"$match": {"age": {"$gt": 28}}},
            {"$project": {"_id":0, "id":1, "hello": {"$literal":"$nORMalstring"}, "abcd":{"$literal":1}}}
        ])

        MongoDB高级语法


    分组操作:

        去重的格式:db.getCollection("the_table").aggregate([{"$group": {"_id": "$被去重的字段名"}}])

            db.getCollection("the_table").aggregate([
                {"$group": {"_id": "$name"}}
            ])

            MongoDB高级语法

            分组操作虽然也能实现去重操作,但是它返回的数据格式与distinct函数是不一样的。distinct函数返回的是数组,而分组操作返回的是几条记录

        去重并统计:

            db.getCollection("the_table").aggregate([
                {"$group": {"_id": "$name","max_age":{"$max":"$age"},"min_age":{"$min":"$age"},"avg_age":{"$avg":"$age"},"sum_age":{"$sum":"$age"}}}
            ])

            MongoDB高级语法

        原则上,$sum和$avg的值对应的字段的值应该都是数字。如果强行使用值为非数字的字段,那么$sum会返回0, $avg会返回null。而字符串是可以比较大小的,所以,$max与$min可以正常应用到字符串型的字段

        还可以使用$sum的值为数字1来统计多少条记录:

            db.getCollection("the_table").aggregate([
                {"$group": {"_id": "$name","doc_count":{"$sum":1},"max_age":{"$max":"$age"},"min_age":{"$min":"$age"},"avg_age":{"$avg":"$age"},"sum_age":{"$sum":"$age"}}}
            ])

            MongoDB高级语法


    分组/去重、最新一条数据:

        MongoDB高级语法

        db.getCollection("the_table").aggregate([
            {"$group": {"_id": "$name","age":{"$last":"$age"},"address":{"$last":"$address"}}}
        ])

        MongoDB高级语法

    

    可以取最新的数据,自然可以取最早的数据:

        db.getCollection("the_table").aggregate([
            {"$group": {"_id": "$name","age":{"$first":"$age"},"address":{"$first":"$address"}}}
        ])

        MongoDB高级语法

    

    拆分数组(用关键字:$unwind):

        格式:collection.aggregate([{"$unwind":"$字段名"}])

        db.getCollection("the_table").aggregate([
            {"$unwind":"$size"}
        ])

        MongoDB高级语法

        还可以把price数组也拆分:

        db.getCollection("the_table").aggregate([
            {"$unwind":"$size"},
            {"$unwind":"$price"}
        ])

        MongoDB高级语法



    联集合查询:

        MongoDB高级语法

        MongoDB高级语法

        主集合.aggregate([
            {
                "$lookup": {
                    "from": "被查集合名",
                    "localField": "主集合的字段",
                    "foreignField": "被查集合的字段",
                    "as": "保存查询结果的字段名"
                }
            }
        ])

        其中的“主集合”与“被查集合”需要搞清楚。如果顺序搞反了, 则结果会不同。
        例如, 现在需要在做博集合中查询用户信息, 那么主集合就是微博集合, 被查集合就是用户集合。于是查询语句可以写为以下:

            db.getCollection("example_post").aggregate([
                {"$lookup":{
                    "from": "example_user",
                    "localField": "user_id",
                    "foreignField": "id",
                    "as": "user_info"
                }}
            ])

            MongoDB高级语法

            (这里user_info字段之所以会是一个数组,是因为被查询集合中可能有多条记录都满足条件,只有使用数组才能把它们都保存下来。由于用户集合每一个记录都是唯一的,所以这个数组只有一个元素)

            联集合查询并美化结果:

                db.getCollection("example_post").aggregate([
                    {"$lookup":{
                        "from": "example_user",
                        "localField": "user_id",
                        "foreignField": "id",
                        "as": "user_info"
                    }},
                    {"$unwind":"$user_info"}
                ])

                MongoDB高级语法

            当然,还可以将联集合查询拆分结果返回特定内容:

                db.getCollection("example_post").aggregate([
                    {"$lookup":{
                        "from": "example_user",
                        "localField": "user_id",
                        "foreignField": "id",
                        "as": "user_info"
                    }},
                    {"$unwind":"$user_info"},
                    {"$project":{
                        "content": 1,
                        "post_time": 1,
                        "name": "$user_info.name",
                        "work": "$user_info.work"
                    }}
                ])

                MongoDB高级语法

            以用户为基准联集合查询:

                db.getCollection("example_user").aggregate([
                    {"$lookup":{
                        "from": "example_post",
                        "localField": "id",
                        "foreignField": "user_id",
                        "as": "weibo_info"
                    }},
                    {"$unwind":"$weibo_info"},
                    {"$project":{
                        "name": 1,
                        "work": 1,
                        "content": "$weibo_info.name",
                        "post_time": "$weibo_info.work"
                    }}
                ])

                MongoDB高级语法

           

            还可以指定只查某人的:

                db.getCollection("example_user").aggregate([
                    {"$match": {"name": "张三疯"}},
                    {"$lookup":{
                        "from": "example_post",
                        "localField": "id",
                        "foreignField": "user_id",
                        "as": "weibo_info"
                    }},
                    {"$unwind":"$weibo_info"},
                    {"$project":{
                        "content": 1,
                        "post_time": 1,
                        "name": "$weibo_info.name",
                        "work": "$weibo_info.work"
                    }}
                ])

                (从性能上讲,建议把$match放在最前面,这样可以充分用到mongodb的索引)

您可能感兴趣的文档:

--结束END--

本文标题: MongoDB高级语法

本文链接: https://www.lsjlt.com/news/41029.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MongoDB高级语法
    and操作:    隐式and操作:        db.getCollection("the_table").find({"age":{"$gt":20},"sex":"男"})   //对age与sex...
    99+
    2022-10-18
  • mongodb高级查询
      MongoDB 的逻辑结构是一种层次结构。主要由文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的用户使用MongoDB 开...
    99+
    2022-10-18
  • MYSQL 一些 高级语法
    从一个表中复制列插入到指定的表中: # 字段的值必须一样 INSERT INTO table2 SELECT * FROM table1; select 子查询 where子查询 # 必须针对一个字段进行查询 ...
    99+
    2020-06-01
    MYSQL 一些 高级语法
  • mongodb高级聚合查询
      https://www.cnblogs.com/zhoujie/p/mongo1.html mongodb高级聚合查询     在工作中会经常遇到一些mongodb的聚合操作,特此总结下。mongo存储的可以是复杂类型,比...
    99+
    2016-06-26
    mongodb高级聚合查询
  • python的一些高级语法
    1.python 可迭代对象的写法a.循环版-迭代器通过实现类的属性方法实现class Fab(object):     def __init__(self, max):         self.max = max         sel...
    99+
    2023-01-31
    语法 高级 python
  • 数据库insert高级语法用法
    这篇文章主要介绍“数据库insert高级语法用法”,在日常操作中,相信很多人在数据库insert高级语法用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库insert高...
    99+
    2022-10-18
  • MySQL高级查询语法分析
    目录一、排序二、分页查询三、聚合函数四、分组查询五、连接查询1. 内连接查询2. 左连接查询3. 右连接查询4. 自连接查询六、子查询一、排序 排序查询语法: select...
    99+
    2022-11-13
  • CSS高级语法的示例分析
    这篇文章主要介绍CSS高级语法的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 选择器的分组 你可以对选择器进行分组,这样,被分组的选择器就可以分享相同的声明。 用逗号...
    99+
    2022-10-19
  • MySQL高级查询语法是什么
    这篇文章将为大家详细讲解有关MySQL高级查询语法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、排序排序查询语法:select * from 表名&nbs...
    99+
    2023-06-29
  • mongodb的基本语法
    1、启动shell:(主要用crt 软件的时候终端要选择linux,否则不能退格键有时候出问题)[root@saltstack mongodb]# mongo> show dbs  ...
    99+
    2022-10-18
  • 有哪些C语言的高级用法
    本篇内容主要讲解“有哪些C语言的高级用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些C语言的高级用法”吧!整形溢出和提升大部分 C 程序员都以为基本的整形操作都是安全的其实不然,看下面这...
    99+
    2023-06-16
  • Java高级语法学习之反射详解
    目录一、什么是反射二、准备测试:实体类的创建三、反射中的几个重要类及方法(一)反射中的重要类之Class(二)反射中的重要类之Field(三)反射中的重要类之Constructor(...
    99+
    2022-11-13
  • MongoDB升级后CPU负载升高的原因和解决方法
    问题近期线上一个三分片集群从 3.2 版本升级到 4.0 版本以后,集群节点的 CPU 的负载升高了很多(10% -> 40%), 除了版本的升级,项目逻辑和操作量均无变化。关闭 Balancer 以...
    99+
    2022-10-18
  • MongoDB数据库—基础语法
    一、MongoDB 数据库的特点及安装 MongoDB 数据库的特点 面向文档,模式自由 json数据模式(bson)(可以初略理解为字典) 多级引索 高可用复制集 水平扩展 跨平台、多种语言接口 弱事...
    99+
    2022-10-18
  • JavaScript中高级语法??表达式用法示例详解
    目录前言具体用法。那么双问号表达式和其他的相似方法有什么不同呢?那么二者之间有什么明显的区别呢?总结前言 在JavaScript中,双问号()表达式是一种非常有用的方法。它的作用是...
    99+
    2023-05-16
    JavaScript语法??表达式 JavaScript高级语法
  • MySQL Select 查询语句详解及高级用法
    MySQL是一个开源的关系型数据库管理系统,支持多种操作语言,其中最基础、最常用的命令之一就是SELECT语句。在本篇文章中,这里将详细介绍MySQL SELECT语句的各个方面,从最基本的查询语句,到更高级的技巧和功能。 一、基本...
    99+
    2023-10-01
    mysql 数据库 sql
  • Bing必学的高级搜索语法有哪些
    这篇文章给大家介绍 Bing必学的高级搜索语法有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用以下关键字可以缩小搜索范围:关键字定义示例contains:只搜索包含指定文件类型的链接的网站。若要搜索包含 Mic...
    99+
    2023-06-12
  • Mysql高级05-SQL语句
    SQL 库结构操作SQL  1、查看所有数据库 show databases; 切换使用数据库 use 数据库名;  3、创建数据库 create database 数据库名; create database 数据库名 ...
    99+
    2014-06-05
    Mysql高级05-SQL语句
  • go是高级语言吗
    go是高级语言。Go语言是Google公司在2009年开源的一门高级编程语言,它为解决大型系统开发过程中的实际问题而设计,支持并发、规范统一、简单优雅,性能强大;它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译...
    99+
    2023-05-14
    Go go语言 Golang
  • MongoDB中有哪些查询语法
    MongoDB中有哪些查询语法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、查询find方法db.collection_n...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作