• MongoDB教程14-MongoDB查询文档


    在关系型数据库中,可以实现基于表的各种各样的查询,以及通过投影来返回指定的列,相应的查询功能也可以在 MongoDB 中实现。同时由于 MongoDB 支持嵌套文档和数组,MongoDB 也可以实现基于嵌套文档和数组的查询。

    MongoDB 查询文档使用 find() 方法。find() 方法以非结构化的方式来显示所有文档。

    find() 简介

    MongoDB 中查询文档使用 find() 方法。find() 方法以非结构化的方式来显示所要查询的文档, 查询数据的语法格式如下:

    >db.collection.find(query, projection)

    query 为可选项,设置查询操作符指定查询条件;projection 也为可选项,表示使用投影操作符指定返回的字段,如果忽略此选项则返回所有字段。

    查询test集合中的所有文档时,为了使显示的结果更为直观,可使用 pretty() 方法以格式化的方式来显示所有文档,方法如下:

    > db.test.find().pretty()

    除了 find() 方法,还可使用 findOne() 方法,它只返回一个文档。

    以下实例我们查询了集合 myColl6 中的数据:

    > db.myColl6.find()
    { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc02"), "name" : "test2", "age" : 20 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc04"), "name" : "test4", "age" : 40 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc05"), "name" : "test5", "age" : 50 }
    { "_id" : ObjectId("5f504ac8e31448829d2dfc06"), "name" : "test6", "age" : 30 }
    >
    > db.myColl6.find().pretty()    // 格式化
    
            "_id" : ObjectId("5f50477ee31448829d2dfbfe"),
            "name" : "test1",
            "age" : 10
    }
    
            "_id" : ObjectId("5f504a9fe31448829d2dfc02"),
            "name" : "test2",
            "age" : 20
    }
    
            "_id" : ObjectId("5f504a9fe31448829d2dfc04"),
            "name" : "test4",
            "age" : 40
    }
    
            "_id" : ObjectId("5f504a9fe31448829d2dfc05"),
            "name" : "test5",
            "age" : 50
    }
    
            "_id" : ObjectId("5f504ac8e31448829d2dfc06"),
            "name" : "test6",
            "age" : 30
    }
    View Code

    查询条件

    MongoDB 支持条件操作符,下表为 MongoDB 与 RDBMS 的条件操作符的对比,可以通过对比来理解 MongoDB 中条件操作符的使用方法。

    MongoDB 与 RDBMS 的查询比较
    操作符格式实例与 RDBMS where 语句比较
    等于(=) {<key> : {<value>}} db.test.find( {price : 24} ) where price = 24
    大于(>) {<key> : {$gt : <value>}} db.test.find( {price : {$gt : 24}} ) where price > 24
    小于(<) {<key> : {$lt : <value>}} db.test.find( {price : {$lt : 24}} ) where price < 24
    大于等于(>=) {<key> : {$gte : <value>}} db.test.find( {price : {$gte : 24}} ) where price >= 24
    小于等于(<=) {<key> : {$lte : <value>}} db.test.find( {price : {$lte : 24}} ) where price <= 24
    不等于(!=) {<key> : {$ne : <value>}} db.test.find( {price : {$ne : 24}} ) where price != 24
    与(and) {key01 : value01, key02 : value02, ...} db.test.find( {name : "《MongoDB 教程》", price : 24} ) where name = "《MongoDB 教程》" and price = 24
    或(or) {$or : [{key01 : value01}, {key02 : value02}, ...]} db.test.find( {$or:[{name : "《MongoDB 教程》"},{price : 24}]} ) where name = "《MongoDB 教程》" or price = 24

    特定类型查询

    特定类型查询结果在 myColl3 集合中有以下文档为基础:

    > db.myColl3.find()
    { "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一个 Nosql 数据库" }
    { "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入数据" }
    { "_id" : 2, "name" : "张三", "age" : 18, "address" : "中国" }
    { "_id" : ObjectId("5f4f4b95e8b8099c8e7dbeca"), "name" : "李四", "age" : 19 }
    { "_id" : ObjectId("5f4f4b95e8b8099c8e7dbecb"), "info" : "Hello", "car" : "buick" }
    { "_id" : ObjectId("5f4f510ae8b8099c8e7dbecc"), "name" : "test", "age" : null }

    查询 age 为 null 的字段的语法格式如下:

    > db.myColl3.find({"age":null})
    { "_id" : ObjectId("5f4f4845e8b8099c8e7dbec9"), "title" : "MongoDB教程", "info" : "MongoDB 是一个 Nosql 数据库" }
    { "_id" : 1, "title" : "insert指定_id", "info" : "MongoDB插入数据" }
    { "_id" : ObjectId("5f4f4b95e8b8099c8e7dbecb"), "info" : "Hello", "car" : "buick" }
    { "_id" : ObjectId("5f4f510ae8b8099c8e7dbecc"), "name" : "test", "age" : null }

    此语句不仅匹配出 age 为 null 的文档,其他不同类型的文档也会被查出。这是因为 null 不仅会匹配某个键值为 null 的文档,而且还会匹配不包含这个键的文档。
    查询数组可使用以下语法格式:

    > db.test.find(
    {
        tags:['MongoDB', 'NoSQL', 'database']
    }
    )
    {"_id" : ObjectId("5ba7342c7f9318ea62161351"), "name": "《MongoDB教程》", "price" : 24, "tags" : [ "MongoDB", "NoSQL", "database"], "by" : "博客园"}

    查询有 3 个元素的数组的代码如下:

    > db.test.find(
    {
        tags:{$size:3}
    }
    )
    {"_id" : Objectld("5baf9b6663ba0fb3ccccle77"), "name" : "《MongoDB 教程》", ''price" : 24, "tags" : ["MongoDB","NoSQL", "database"], "by" : "博客园"}
    {"_id" : Objectld ("5baf 9bc763ba0fk>3ccccle78"), "name" : "《Java 教程》", "price" : 36, "tags" : ["编程语言", "Java语言", "面向对象程序设计语言"], "by" : "博客园"}

    查询数组里的某一个值的代码如下:

    > db.test.find(
    {
        tags: "MongoDB"
    }
    )
    {"_id" : Objectld("5baf9b6663ba0fb3ccccle77"), "name" : "《MongoDB 教程》", ''price" : 24, "tags" : ["MongoDB","NoSQL", "database"], "by" : "博客园"}

    limit() 函数与 SQL 中的作用相同,用于限制查询结果的个数,如下语句只返回 3 个匹配的结果。若匹配的结果不到 3 个,则返回匹配数量的结果:

    > db.myColl5.find()
    { "_id" : 1, "name" : "666", "age" : 26 }
    { "_id" : 2, "name" : "test1", "age" : 20 }
    { "_id" : 3, "name" : "test2", "age" : null }
    { "_id" : 4, "name" : "test3", "age" : 40 }
    >
    > db.myColl5.find().limit(2)
    { "_id" : 1, "name" : "666", "age" : 26 }
    { "_id" : 2, "name" : "test1", "age" : 20 }
    >
    > db.myColl5.find().limit(10)
    { "_id" : 1, "name" : "666", "age" : 26 }
    { "_id" : 2, "name" : "test1", "age" : 20 }
    { "_id" : 3, "name" : "test2", "age" : null }
    { "_id" : 4, "name" : "test3", "age" : 40 }

    skip() 函数用于略过指定个数的文档,如下语句略过前两个文档,返回后两个:

    > db.myColl5.find()
    { "_id" : 1, "name" : "666", "age" : 26 }
    { "_id" : 2, "name" : "test1", "age" : 20 }
    { "_id" : 3, "name" : "test2", "age" : null }
    { "_id" : 4, "name" : "test3", "age" : 40 }
    >
    > db.myColl5.find().skip(2)
    { "_id" : 3, "name" : "test2", "age" : null }
    { "_id" : 4, "name" : "test3", "age" : 40 }

    sort() 函数用于对查询结果进行排序,1 是升序,-1 是降序,如下语句可将查询结果升序显示:

    > db.myColl5.find()
    { "_id" : 1, "name" : "666", "age" : 26 }
    { "_id" : 2, "name" : "test1", "age" : 20 }
    { "_id" : 3, "name" : "test2", "age" : null }
    { "_id" : 4, "name" : "test3", "age" : 40 }
    >
    > db.myColl5.find().sort({"age":-1})  // 降序
    { "_id" : 4, "name" : "test3", "age" : 40 }
    { "_id" : 1, "name" : "666", "age" : 26 }
    { "_id" : 2, "name" : "test1", "age" : 20 }
    { "_id" : 3, "name" : "test2", "age" : null }
    >
    > db.myColl5.find().sort({"age":1})  // 升序
    { "_id" : 3, "name" : "test2", "age" : null }
    { "_id" : 2, "name" : "test1", "age" : 20 }
    { "_id" : 1, "name" : "666", "age" : 26 }
    { "_id" : 4, "name" : "test3", "age" : 40 }

    使用 $regex 操作符来设置匹配字符串的正则表达式,不同于全文检索,使用正则表达式无须进行任何配置。如下所示为使用正则表达式查询含有 MongoDB 的文档:

    > db.test.find({tags:{$regex:"MongoDB"}})
    {"_id" : Objectld("5baf9b6663ba0fb3ccccle77"), "name" : "《MongoDB 教程》", ''price" : 24, "tags" : ["MongoDB","NoSQL", "database"], "by" : "博客园"}

    示例

    > db.myColl6.find()
    { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc02"), "name" : "test2", "age" : 20 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc04"), "name" : "test4", "age" : 40 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc05"), "name" : "test5", "age" : 50 }
    { "_id" : ObjectId("5f504ac8e31448829d2dfc06"), "name" : "test6", "age" : 30 }
    >
    > db.myColl6.find({"age":{$gt:40}})  // 查询age>40的文档
    { "_id" : ObjectId("5f504a9fe31448829d2dfc05"), "name" : "test5", "age" : 50 }
    >
    > db.myColl6.find({"age":{$gte:40}})  // age>=40
    { "_id" : ObjectId("5f504a9fe31448829d2dfc04"), "name" : "test4", "age" : 40 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc05"), "name" : "test5", "age" : 50 }
    >
    > db.myColl6.find({"age":{$lt:40}})  // age < 40
    { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc02"), "name" : "test2", "age" : 20 }
    { "_id" : ObjectId("5f504ac8e31448829d2dfc06"), "name" : "test6", "age" : 30 }
    >
    > db.myColl6.find({"age":{$lte:40}})  // age <=40
    { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc02"), "name" : "test2", "age" : 20 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc04"), "name" : "test4", "age" : 40 }
    { "_id" : ObjectId("5f504ac8e31448829d2dfc06"), "name" : "test6", "age" : 30 }
    >
    > db.myColl6.find({"age":{$ne:40}}) // age != 40
    { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc02"), "name" : "test2", "age" : 20 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc05"), "name" : "test5", "age" : 50 }
    { "_id" : ObjectId("5f504ac8e31448829d2dfc06"), "name" : "test6", "age" : 30 }
    >
    > db.myColl6.find({"age":30, "name":"test3"})  // age=30 and name="test3"
    >
    > db.myColl6.find({"age":30, "name":"test6"})  // age=30 and name="test6"
    { "_id" : ObjectId("5f504ac8e31448829d2dfc06"), "name" : "test6", "age" : 30 }
    >
    > db.myColl6.find({$or:[{"name":"test2"}, {"age":40}]})  // name="test2" or age=40
    { "_id" : ObjectId("5f504a9fe31448829d2dfc02"), "name" : "test2", "age" : 20 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc04"), "name" : "test4", "age" : 40 }
    >
    > db.myColl6.find({$or:[{"name":"test2"}, {"age":{$lt:30}}]})  // name="test2" or age<30
    { "_id" : ObjectId("5f50477ee31448829d2dfbfe"), "name" : "test1", "age" : 10 }
    { "_id" : ObjectId("5f504a9fe31448829d2dfc02"), "name" : "test2", "age" : 20 }
  • 相关阅读:
    列表推导式,生成器表达式
    迭代器,生成器初始
    装饰器的进阶
    函数名用途,初始装饰器
    函数参数,和空间
    py文件的操作
    字符串相关操作
    python基础二
    Django简介
    Django初识
  • 原文地址:https://www.cnblogs.com/no-celery/p/13606243.html
Copyright © 2020-2023  润新知