zoukankan      html  css  js  c++  java
  • MongoDB查询文档

    find()方法

    要从MongoDB集合查询数据,需要使用MongoDB的find()方法。

    语法

    find()命令的基本语法如下:

    >db.COLLECTION_NAME.find(document)

     

    find()方法将以非结构化的方式显示所有文档。

    插入测试数据:

    db.mycol.insert({name:"liang",age:28,address:"guangxi"});
    db.mycol.insert({name:"guo",age:25,address:"shanghai"});
    db.mycol.insert({name:"jun",age:18,address:"jiangxi"});
    db.mycol.insert({name:"chen",age:15,address:"shandong"});
    db.mycol.insert({name:"wang",age:30,address:"hebei"});
    db.mycol.insert({name:"he",age:100,address:"beijing"});
    db.mycol.insert({name:"liu",age:8,address:"fujian"});
    db.mycol.insert({name:"zhang",age:44,address:null});




    多条件查询。下面的示例等同于SQL语句的where name = "liang" and age = 28
    db.mycol.find({"name":"liang","age":28})

    返回指定的文档键值对。下面的示例将只是返回name 键值对。
    db.mycol.find({}, {"name":1})

    指定不返回的文档键值对。下面的示例将返回除name之外的所有键值对。
    db.mycol.find({}, {"name":0})

    null数据类型的查询:
    在进行值为null数据的查询时,所有值为null,以及不包含指定键的文档均会被检索出来。
    db.mycol.find({"address":null})

    需要将null作为数组中的一个元素进行相等性判断,即便这个数组中只有一个元素。再有就是通过$exists判断指定键是否存在。
    db.mycol.find({"address": {"$in": [null], "$exists":true}})

     数组数据查询:
    --基于数组的查找。
    > db.test.find()
    { "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), "fruit" : [ "apple", "banana", "peach" ] }
    { "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), "fruit" : [ "apple", "kumquat","orange" ] }
    { "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), "fruit" : [ "cherry", "banana","apple" ] }

    --数组中所有包含banana的文档都会被检索出来。
    > db.test.find({"fruit":"banana"})
    { "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), "fruit" : [ "apple", "banana", "peach" ] }
    { "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), "fruit" : [ "cherry", "banana","apple" ] }

    --检索数组中需要包含多个元素的情况,这里使用$all。下面的示例中,数组中必须同时包含apple和banana,但是他们的顺序无关紧要。
    > db.test.find({"fruit": {"$all": ["banana","apple"]}})
    { "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), "fruit" : [ "apple", "banana", "peach" ] }
    { "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), "fruit" : [ "cherry", "banana", "apple" ] }

    --下面的示例表示精确匹配,即被检索出来的文档,fruit值中的数组数据必须和查询条件完全匹配,即不能多,也不能少,顺序也必须保持一致。
    > db.test.find({"fruit":["apple","banana","peach"]})
    { "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), "fruit" : [ "apple", "banana", peach" ] }

    --下面的示例将匹配数组中指定下标元素的值。数组的起始下标是0。
    > db.test.find({"fruit.2":"peach"})
    { "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), "fruit" : [ "apple", "banana", peach" ] }

    --可以通过$size获取数组的长度,但是$size不能和比较操作符联合使用。
    > db.test.find({"fruit": {$size : 3}})
    { "_id" : ObjectId("4fd5a177b9ac507e96276f1f"), "fruit" : [ "apple", "banana", "peach" ] }
    { "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), "fruit" : [ "apple", "kumquat","orange" ] }
    { "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), "fruit" : [ "cherry", "banana","apple" ] }

    --如果需要检索size > n的结果,不能直接使用$size,只能是添加一个额外的键表示数据中的元素数据,在操作数据中的元素时,需要同时更新size键的值。
    --为后面的实验构造数据。
    > db.test.update({}, {"$set": {"size":3}},false,true)
    > db.test.find()
    { "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), "fruit" : [ "apple", "kumquat", "orange" ], "size" : 3 }
    { "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), "fruit" : [ "cherry", "banana", "apple" ], "size" : 3 }

    --每次添加一个新元素,都要原子性的自增size一次。
    > test.update({},{"$push": {"fruit":"strawberry"},"$inc":{"size":1}},false,true)
    > db.test.find()
    { "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), "fruit" : [ "apple", "kumquat", "orange", "strawberry" ], "size" : 4 }
    { "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), "fruit" : [ "cherry", "banana", "apple", "strawberry" ], "size" : 4 }

    --通过$slice返回数组中的部分数据。"$slice":2表示数组中的前两个元素。
    > db.test.find({},{"fruit": {"$slice":2}, "size":0})
    { "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), "fruit" : [ "apple", "kumquat" ]}
    { "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), "fruit" : [ "cherry", "banana" ]}

    --通过$slice返回数组中的部分数据。"$slice":-2表示数组中的后两个元素。
    > db.test.find({},{"fruit": {"$slice":-2}, "size":0})
    { "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), "fruit" : [ "orange", "strawberry" ] }
    { "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), "fruit" : [ "apple", "strawberry" ] }

    --$slice : [2,1],表示从第二个2元素开始取1个,如果获取数量大于2后面的元素数量,则取后面的全部数据。
    > db.test.find({},{"fruit": {"$slice":[2,1]}, "size":0})
    { "_id" : ObjectId("4fd5a18cb9ac507e96276f20"), "fruit" : [ "orange" ] }
    { "_id" : ObjectId("4fd5a1f0b9ac507e96276f21"), "fruit" : [ "apple" ] }

    内嵌文档查询:
    -为后面的示例构造测试数据。
     db.test.find()
     "_id" : ObjectId("4fd5ada3b9ac507e96276f22"), "name" : { "first" : "Joe", "last" : "He" }, "age" : 45 }
     
    -当嵌入式文档为数组时,需要$elemMatch操作符来帮助定位某一个元素匹配的情况,否则嵌入式文件将进行全部的匹配。
    -即检索时需要将所有元素都列出来作为查询条件方可。
     db.test.findOne()

        "_id" : ObjectId("4fd5af76b9ac507e96276f23"),
        "comments" : [
                {
                        "author" : "joe",
                        "score" : 3
                },
                {
                        "author" : "mary",
                        "score" : 6
                }
        ]

     db.test.find({"comments": {"$elemMatch": {"author":"joe","score":{"$gte":3}}}}
     "_id" : ObjectId("4fd5af76b9ac507e96276f23"), "comments" : [ { "author" : "joe", "score" : 3 }, { "author" : "mary", "score" : 6 } ] }
     
     

    pretty()方法

    要以格式化的方式显示结果,可以使用pretty()方法。

    语法

    > db.mycol.find().pretty()
    
    Shell

    示例

    >db.mycol.find().pretty()
    {
       "_id": 100,
       "title": "MongoDB Overview", 
       "description": "MongoDB is no sql database",
       "by": "yiibai tutorials",
       "url": "http://www.yiibai.com",
       "tags": ["mongodb", "database", "NoSQL"],
       "likes": "100"
    }
    >
    
     

    除了find()方法外,还有一个findOne()方法,它只返回一个文档。

    MongoDB 与 RDBMS的等效 Where 子句

    要在一些条件的基础上查询文档,可以使用以下操作。

    操作语法示例RDBMS等效语句
    相等 {<key>:<value>} db.mycol.find({"by":"yiibai"}).pretty() where by = 'yiibai'
    小于 {<key>:{$lt:<value>}} db.mycol.find({"likes":{$lt:50}}).pretty() where likes < 50
    小于等于 {<key>:{$lte:<value>}} db.mycol.find({"likes":{$lte:50}}).pretty() where likes <= 50
    大于 {<key>:{$gt:<value>}} db.mycol.find({"likes":{$gt:50}}).pretty() where likes > 50
    大于等于 {<key>:{$gte:<value>}} db.mycol.find({"likes":{$gte:50}}).pretty() where likes >= 50
    不等于 {<key>:{$ne:<value>}} db.mycol.find({"likes":{$ne:50}}).pretty() where likes != 50

    下面我们将对上表中的所有操作演示 -

    MongoDB中的AND操作符

    语法

    find()方法中,如果通过使用’‘将它们分开传递多个键,则 MongoDB 将其视为AND条件。 以下是AND的基本语法 -

    >db.mycol.find(
       {
          $and: [
             {key1: value1}, {key2:value2}
          ]
       }
    ).pretty()
    
     

    示例

    以下示例将显示由“yiibai tutorials”编写并且标题为“MongoDB Overview”的所有教程。

    > db.mycol.find({$and:[{"by":"yiibai tutorials"},{"title": "MongoDB Overview"}]}).pretty()
    {
            "_id" : 100,
            "title" : "MongoDB Overview",
            "description" : "MongoDB is no sql database",
            "by" : "yiibai tutorials",
            "url" : "http://www.yiibai.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }
    >
    
     

    对于上面给出的例子,等效的SQL where子句是 -

    SELECT * FROM mycol where by ='yiibai tutorials' AND title ='MongoDB Overview'
    
    SQL

    可以在find子句中传递任意数量的键值。

    MongoDB中的OR操作符

    语法

    在要根据OR条件查询文档,需要使用$or关键字。 以下是OR条件的基本语法 -

    >db.mycol.find(
       {
          $or: [
             {key1: value1}, {key2:value2}
          ]
       }
    ).pretty()
    
     

    示例

    以下示例将显示由“yiibai tutorials”编写或标题为“MongoDB Overview”的所有教程。

    >db.mycol.find({$or:[{"by":"yiibai tutorials"},{"title": "MongoDB Overview"}]}).pretty()
    {
       "_id": 100,
       "title": "MongoDB Overview", 
       "description": "MongoDB is no sql database",
       "by": "yiibai tutorials",
       "url": "http://www.yiibai.com",
       "tags": ["mongodb", "database", "NoSQL"],
       "likes": "100"
    }
    >
    
     

    使用 AND 和 OR 条件一起

    示例

    以下示例将显示likes大于10以及标题是“MongoDB Overview”或者“yiibai tutorials”的所有文档。 等价SQL where子句为 -

    SELECT * FROM mycol where likes> 10 AND(by ='yiibai tutorials' OR title ='MongoDB Overview')
    
     
    >db.mycol.find({"likes": {$gt:10}, $or: [{"by": "yiibai tutorials"},
       {"title": "MongoDB Overview"}]}).pretty()
    {
       "_id": 100,
       "title": "MongoDB Overview", 
       "description": "MongoDB is no sql database",
       "by": "yiibai tutorials",
       "url": "http://www.yiibai.com",
       "tags": ["mongodb", "database", "NoSQL"],
       "likes": "100"
    }
    >
    
     

    查询嵌入/嵌套文档

    这里演示如何使用:db.collection.find()方法对嵌入/嵌套文档的查询操作的示例。 此页面上的示例使用inventory集合。要填充库存(inventory)集合以准备一些数据,请运行以下命令:

    db.inventory.insertMany( [
       { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
       { item: "notebook", 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" },
       { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
       { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
    ]);
    
     

    匹配嵌入/嵌套文档

    要在作为嵌入/嵌套文档的字段上指定相等条件,请使用查询过滤器文档{<field>:<value>},其中<value>是要匹配的文档。

    例如,以下查询选择字段size等于{ h: 14, w: 21, uom: "cm" }的所有文档:

    db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
    
     

    整个嵌入式文档中的相等匹配需要精确匹配指定的<value>文档,包括字段顺序。
    例如,以下查询与库存(inventory)集合中的任何文档不匹配:

    db.inventory.find(  { size: { w: 21, h: 14, uom: "cm" } }  )
    
     

    查询嵌套字段

    要在嵌入/嵌套文档中的字段上指定查询条件,请使用点符号(“field.nestedField”)。

    在嵌套字段上指定等于匹配

    以下示例选择在size字段中嵌套的字段uom等于“in”的所有文档:

    db.inventory.find( { "size.uom": "in" } )
    
     

    使用查询运算符指定匹配

    查询过滤器文档可以使用查询运算符来指定,如以下形式的条件:

    { <field1>: { <operator1>: <value1> }, ... }
    
     

    以下查询使用size字段中嵌入的字段h中的小于运算符($lt):

    db.inventory.find( { "size.h": { $lt: 15 } } )
    
     

    指定AND条件

    以下查询选择嵌套字段h小于15的所有文档,嵌套字段uom等于“in”,status字段等于“D”:

    db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )
    
     

    like

    (mongoDB 支持正则表达式)

    select * from users where name like "%hurry%";

    db.users.find({name:/hurry/});

    select * from users where name like "hurry%";

    db.users.find({name:/^hurry/});

    distinct

    select distinct (name) from users;

    db.users.distinct('name');

  • 相关阅读:
    JSON格式解析和libjson使用简介(关于cjson的使用示例)
    我还没死!!微信公众号——自媒体的营销之路
    android应用开发-从设计到实现 3-4 静态原型的状态栏
    一种绝对提高开发水平的方法
    年近30------职业回想与思考
    LeetCode Populating Next Right Pointers in Each Node
    uploadify在火狐下上传不了的解决方式,java版(Spring+SpringMVC+MyBatis)具体解决方式
    struct和typedef struct
    奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法
    Floyd算法解说
  • 原文地址:https://www.cnblogs.com/liang545621/p/7372526.html
Copyright © 2011-2022 走看看