• mongoDB学习笔记<一>


    1.find函数的要点和使用

    find的介绍与使用

    MongoDB数据查询使用find函数,其功能与SQL中的select函数相同,可提供与关系型数据库类似的许多功能,包含映射、排序等。

    db.集合名.find(query,fields,limit,skip)

    主要有四个参数:

       query:指明查询条件,相当于SQL中的where语句

       fields:用于字段映射,指定是否返回该字段,0代表不返回,1代表返回

       limit:限制查询的结果集的文档数量,指定查询返回结果集的上限

       skip:跳过一定数据量的结果,设置第一条返回文档的偏移量

    注意事项

           mongoDB不支持多集合间的连接查询,find函数一次查询只能针对一个集合

           find参数为空或者查询条件为空文档时,返回集合中的全部文档

      除了limit和skip作为find函数的参数外,还可以单独使用limit和skip函数来修饰查询结果

      返回的查询结果集在默认的情况下是无序的,如果需要对结果集进行排序,可以使用sort函数

      db.collection.findOne()只会返回第一条数据

           当查询的集合文档数量很大时,为了加快数据的查询速度可以创建索引

      除了使用find函数实现基本查询外,MongoDB还提供了聚合框架,用于复杂查询

    2. 查询操作符的介绍及使用

      2.1条件操作符

        $gt  >

        $gte >=

        $lt  <

        $lte <=

        $ne  !=

        如:某集合B集合中文档有属性x值为整数,需查找10<x<=30的文档

        db.B.find({"x":{"$gt":10,"$lte":30}})

        如:从某集合B中查找日期属性day值大于2012/01/01的文档数据db.B.find({"day":{"$gt":new Date("2012/01/01")}})

      2.2    $in包含/$nin不包含

        $in:查询匹配指定条件值的文档;

        $nin:查询不匹配指定条件值的文档;

        SQL:写法:字段 in ('值1','值1'.....)

        mongodb:db.B.find({"x":{"$in":['值1','值2',.....]}})

        SQL:写法:字段 not in ('值1','值1'.....)

        mongodb:db.B.find({"x":{"$nin":['值1','值2',.....]}})

        $in/$nin优点:可指定不同类型条件和值。

      2.3    $or或查询

        $or:查询匹配多个条件多个值的文档;

        SQL:写法:字段1 = 'xxx' or 字段2 in ( 'xxx').....

        Mongodb :db.B.find({"$or":[{"x":{"$in":['值1','值2'...]}},{"y":"3"}]})

      2.4 $all匹配所有

           {"name":jack,"age":[1,2,3]}

        {"name":jack,"age":[1,4,3]}

        db.B.find({"age":{"$all":[2,3]}})

        结果:{"name":jack,"age":[1,2,3]}

        $all的查询模式更像是去取交集,即同时满足查询条件才能被查询出来

      2.5  $exists判断属性是否存在

        db.B.find({"name":{"$exists":true}})   --查找属性name存在的文档

        db.B.find({"name":{"$exists":false}})  --查找属性name不存在的文档

      2.6  属性值为null的情况

        如下操作并可知道:

        > db.C.find()

        { "_id" : ObjectId("5018fccd1781352fe25bf511"), "a" : "14", "b" : "14" }

        { "_id" : ObjectId("5018fccd1781352fe25bf512"), "a" : "15", "b" : "15" }

        { "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }

        > db.C.find({"c":null})

        { "_id" : ObjectId("5018fccd1781352fe25bf511"), "a" : "14", "b" : "14" }

        { "_id" : ObjectId("5018fccd1781352fe25bf512"), "a" : "15", "b" : "15" }

        { "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }

        可见查询属性c值为null文档,包括属性c值为null、该属性c不存在两个部分。若想只查询属性c为null的文档

        如下:

        > db.C.find({"c":{"$in":[null],"$exists":true}})

        { "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }

      2.7  $not元条件句

        可与其他条件配合使用,即不在匹配范围之内的文档

      2.8  $mod取模运算

        db.B.find({"age":{"$mod":[5,1]}}) --表示查找年龄/5余1的所有文档

        若查找年龄/5余1之外的所有文档,可结合$not运算:

        db.B.find({"age":{"$not":{"$mod":[5,1]}}})

      2.9  正则表达式

         db.B.find({"name":/jack/i})

      2.10 $size

        { "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 1, 2, 3 ] }

       { "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }

       > db.C.find({"b":{"$size":2}})

       { "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] } 

      2.11 $slice

        返回数组的一个子集,即对以某属性为基础,返回多少条(范围)。也可以接受偏移值和要返回的元素数量,来返回中间的结果。

        > db.C.find()

        { "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 1, 2, 3 ] }

        { "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }

        > db.C.findOne({},{"b":{"$slice":[2,3]}})

        { "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 3 ] }

        > db.C.findOne({},{"b":{"$slice":-2}})

        {"_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 2, 3 ]}

      

      2.12 $where

           即可执行任务JavaScript作为查询的一部分。

            $where的值可以是function、也可以是字符串等等。

      db.C.find({"$where":function(){return this.a == "1"}})与db.C.find({"$where":"this.a == '1'"}})

      注意:采用$where子句查询在速度上较常规查询慢的多。因文档需要从BSON转换成javascript对象,然后通过"$where"的表达式来运行。

      不用利用索引。可用常规查询做前置过滤,配置"$where"查询进行调优,可达到不牺牲性能的要求。

    3. 游标

       使用游标返回find的执行结果,客户端对游标的实现通常能对结果进行数量的限制、略过部分结果、排序等有效控制。

      var cursor = db.C.find()     --定义游标

      while(cursor.hasNext()){

         var obj = cursor.next();

         print(obj.a);

         ......

      }

      db.C.find().limit(10)  --限制查询的结果条数为10条

      db.C.find().skip(10)   --忽略匹配的前10条,显示从第11条匹配的文档开始所有的文档

      db.C.find().sort({"a":-1})  --sort以键/值,表示按某个属性进行排序,1:升序,-1:降序

      高级查询选项:

      $maxscan:integer  --指定查询最多扫描的文档数量

      $min:document     --查询的开始条件

      $max:document     --查询的结束条件

      $hint:document    --指定服务器使用哪个索引进行查询

      $explain:boolean  --获取查询执行的细节(用到的索引、结果数量、耗时等),而并非真正执行查询

      $snapshot:boolean --确保查询的结果是在查询执行那一刻的一致快照

  • 相关阅读:
    SpringCloud高可用和高并发
    时间重要性,我们需要如何利用极致
    Spring是什么 包括SpringBean SpringMVC SpringBoot SpringCloud
    Java 线程的基本使用
    JVM 内存模型
    Java 8 ArrayList 详解
    Java 8 HashMap 源码解析
    Docker 运行 MySQL,使用 docker-compose
    Spring Boot 主从读写分离
    Spring Boot 整合 MyBatis 实现乐观锁和悲观锁
  • 原文地址:https://www.cnblogs.com/zhang-yong/p/7355496.html
Copyright © 2020-2023  润新知