zoukankan      html  css  js  c++  java
  • MongoDB学习(查找文档和其他数据查找操作)

    理解Cursor对象和查询运算符

    cursor对象

      cursor对象相当于一个指针,可通过迭代它来访问MongdoDB数据库中的一组对象。

      在使用 find() 方法查询时,返回的并非实际文档,而是一个Cursor对象,也就是一个指向第一个数据之前的指针。

      Cursor对象内部存储了一个指向当前位置的索引,可以保证每次读取一个文档。在MongoDB中,有些操作只影响Cursor中的当前文档,并将索引数加 1,而有些操作影响当前索引之后的所有文档。

    查询运算符

      在进行查找时,可以使用一些查询运算符来进行查询匹配。以来判断文档中字段的值是否符合指定的条件。类似与 sql 语句中 where 查询后面的条件。

    运算符 描述 示例
    field:value 与字段值为value的文档匹配 { name : "myName" }
    $gt 与字段值大于指定值的文档匹配 { size : { $gt : 5 } }
    $gte 与字段值大于等于指定值的文档匹配 { size : { $gte : 5 } }
    $in 与字段值包含在指定数组中的文档匹配 { like : { $in : [ "C","JAVA" ] } }
    $lt 与字段值小于指定值的文档匹配 { size : { $lt : 5} }
    $lte 与字段值小于等于指定值的文档匹配 { size : { $lte : 5 } }
    $ne 与字段值不等于指定值的文档匹配 { name : {$ne : "badName"} }
    $nin 与字段值不包含在指定数组中的文档匹配 { name : { $nin : ["html","css"] } }
    $or 使用逻辑或连接查询字句,并返回符合任何一个字句条件的文档 { $or : [ {size : {$lt : 5} }, {size : {$gt : 10} } ] }
    $and 使用逻辑与连接查询字句,并返回与两个字句条件都匹配的文档 { $and : [ { size : { $gt : 5 } },{ size : { $lt : 10 } } ] }
    $not 反转查询表达式的效果,返回与查询表达式不匹配的文档 { $not : { name : "myName" } }
    $nor 使用逻辑或非连接查询字句,返回与两个字句都不匹配的文档 { $nor : { size : { $gt : 5 } },{ size : { $lt : 0 } } }
    $exists 值为 true 时匹配包含指定字段的文档,为 false 时返回不包含该字段的文档 { name : { $exists : true } }
    $regex 返回指定字段的值与指定正则表达式匹配的文档 { myString : { $regex : ' some.*exp ' } }
    $all 返回指定数组包含所有指定的元素的文档 { word : { $all : [ 'a','b','c' ] } }
    $elemMatch 返回指定的数组字段至少有一个元素与指定的条件都匹配的文档 { myArr : { $elemMatch : { { value : { $gt : 5 } },{ size : { $lt : 10 } } } } }
    $size 指定数组的长度 { myArr : { $size : 5 } }

    查询文档

    find() 方法

      查询集合中的文档可以用 find() 方法进行查询,其语法为

       find( query, projection)

    •   query :可选,使用查询操作符指定查询条件
    •   projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

      find() 方法返回一个 find()Cursor对象,表示与查询条件匹配的文档。

    function (query, fields, limit, skip, batchSize, options) {
        var cursor = new DBQuery(this._mongo,
                                 this._db,
                                 this,
                                 this._fullName,
                                 this._massageObject(query),
                                 fields,
                                 limit,
                                 skip,
                                 batchSize,
                                 options || this.getQueryOptions());
    
        {
            const session = this.getDB().getSession();
    
            const readPreference = session._serverSession.client.getReadPreference(session);
            if (readPreference !== null) {
                cursor.readPref(readPreference.mode, readPreference.tags);
            }
    
            const readConcern = session._serverSession.client.getReadConcern(session);
            if (readConcern !== null) {
                cursor.readConcern(readConcern.level);
            }
        }
    
        return cursor;
    }

       示例:

      

    findOne()方法

      它的用法与 find() 相同,只是  findOne() 只返回与查询条件匹配的第一个文档。

      示例:

    根据多个字段查询文档

      根据多个字段进行查询时,可以将多个查询字段放在一个文档中查询,或者使用 $and 连接符进行连接。

      注意:根据多个字段查询文档时,若将多个字段放在多个文档中查询时,只能根据第一个文档查询出数据。第二个文档会作为另一个可选参数(投影)。

    根据子文档查询

      根据子文档的字段值进行查询时,可用 find( { " 子文档.子文档字段 " :value } ) 方法进行查询。

      示例:

     1 {
     2     "_id" : ObjectId("5ca86917e8717d2b3f6e21e3"),
     3     "name" : "张三",
     4     "age" : 18,
     5     "father" : {
     6         "name" : "uzi",
     7         "age" : 24
     8     }
     9 }
    10 {
    11     "_id" : ObjectId("5ca86917e8717d2b3f6e21e4"),
    12     "name" : "李四",
    13     "age" : 19,
    14     "father" : {
    15         "name" : "letme",
    16         "age" : 25
    17     }
    18 }
    19 {
    20     "_id" : ObjectId("5ca86917e8717d2b3f6e21e5"),
    21     "name" : "王五",
    22     "age" : 20,
    23     "father" : {
    24         "name" : "zitai",
    25         "age" : 26
    26     }
    27 }
    集合中的数据

      

    注意字段值为null

      在文档中尽量不要将值赋为null,因为进行null查询时(例如name=null),不仅会返回name值为null的文档,也会将不包含name字段的文档返回。所以应尽量避免使用null值,而应不包含这样的字段,这样就可以使用 $exists运算符进行不包含查询了。

    其他数据查找操作

    计算文档数

      查询集合中的文档数时,可使用 db.collection_name.count() 进行计算。

      

      若想查询符合条件的文档数时,可使用 db.collection_name.find().count() 进行计算。

      

    对结果集进行排序

      在MongoDB中对结果集进行排序时,可以用Cursor对象的 sort() 方法。sort() 方法可以按照字段的值进行升降排序。1 为升序, -1 为降序。

      该方法返回的也是一个Cursor对象,可以继续使用Cursor对象的其他方法,如limit() 等。

      示例:

    db.num.find().sort({a:1})

    限制结果集的大小

      在MongoDB中想要限制结果集的数据量,可以调用Cursor对象的 limit() 方法。他可以让Cursor对象返回指定数量的文档。

      该方法返回的也是一个Cursor对象,可以继续使用CUrsor对象的其他方法。

      limit(number) 方法接受一个数字类型参数,即要显示的文档数。

    db.collection_name.find().limit(number)

    限制返回的字段(投影)

      为了限制文档检索时返回的数据量,只获得有用的信息,抛除无效信息,可以通过find() 方法的第二个可选参数 projection参数。

      在MongdoDB中使用 find() 方法时,默认是显示文档中的所有字段。可以通过给字段赋 1/true 表示包含,赋 -1/false 表示排除。

      当字段包含时,只会显示包含的字段;当字段排除时,会显示出排除外的所有字段。但是在同一个表达式中,不能同时指定包含和排除。

      示例:

    db.student.find({},{name:1})

    结果集分页

      为减少返回的文档数,可以对结果集进行分页。跳过部分文档,直接显示后面的部分文档。

      要进行分页显示可以用 Cursor对象的 limit() 方法和 skip() 方法。

      skip() 方法可以指定在返回文档前跳过多少个文档。

    db.collection_name.find().skip(number).limit(number)

      对数据进行分页时,可以调用方法 sort() 来确保数据的排列顺序不变。

    返回某个字段的值

      在MongoDB中,可以获取一组文档中某个字段的不同值列表。

      Collection对象的 distinct() 方法可以找出指定字段的不同值列表。这种方法的语法为:

    db.collection_name.distinct( key,[query] )
    •    key:指定要获得值的字段
    •   query:表示查询条件。

      示例:

    $type操作符

      $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

      示例:

      想要获取name值为string类型的数据,可以使用命令

    db.aaa.find({"name":{$type:2}})
    或
    db.aaa.find({"name":{$type:'string'}})

  • 相关阅读:
    【AppScan心得】IBM Rational AppScan 无法记录登录序列
    tomcat记录XForwardedFor字段中的远程IP
    【AppScan深入浅出】修复漏洞:会话标识未更新(中危)
    用java在Windows控制台输出utf8字符
    【图解漏洞】图解跨站脚本攻击(XSS)原理
    【图解漏洞】图解跨站请求伪造(CSRF)原理(之二)
    雅克比矩阵(Jacobian Matrix)在正运动学中的应用
    游戏物理引擎之静态碰撞
    万向节死锁(Gimbal Lock)
    旋转矩阵(Rotate Matrix)的性质分析
  • 原文地址:https://www.cnblogs.com/shangyang/p/10661538.html
Copyright © 2011-2022 走看看