zoukankan      html  css  js  c++  java
  • mongodb_查询操作使用_条件查询、where子句等(转并学习) 简单

    <?php
    /*
     mongodb_查询操作使用_条件查询、where子句等(转并学习)
    
    1.find()/findOne()
    mongodb数据库的查询操作即使用find()或者findOne()函数,也可根据不同的条件进行查询。查询的写法(以find()为例)可以如下:
    db.A.find()/db.A.find({})
    
    "{}"是否省略不影响查询,都表示查找集合A下的所有文档。也可以以文档做条件:db.A.find({"a":1,"b":1}),其中查找同时满足属
    性a等于1且属性b也等于1的文档,若需要满足属性c等于1,可直接添加到文档中:db.A.find({"a":1,"b":1,"c":1})。
    
    2.指定键的设置
    指定键的设置即展示,比如某集合有10个属性,经查询后只关心集合中文档的某几个属性。如下文档:
    { "_id" : ObjectId("5018da521781352fe25bf4d2"), "a" : "1", "b" : "1", "c" : "1", "d" : "1", "e" : "1" }
    只关系属性a,b,c可如下设置:
    db.A.find({},{"a,":1,"b":1,"c":,"_id":0})
    这里的1和0与文档中的键值是不同意义的,这里的1:表示显示,0:表示不显示。其中"_id"键默认存在的,需要显示设置。
    
    结果如下:
    { "a" : "1", "b" : "1", "c" : "1" }
    
     
    
    --------------------------------------条件查询可类比结构化查询语句SQL--------------------------------------------
    3.条件查询
    3.1 条件操作符
    "$lt"===================>"<"
    "$lte"==================>"<="
    "$gt"===================>">"
    "$gte"==================>">="
    "$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")}})
    适合于需要进行日调度、月调度、周调度数据等业务处理范围的场合。
    
    3.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优点:可指定不同类型条件和值。
    
    3.3 $or或查询
    
    $or:查询匹配多个条件多个值的文档;
    
    SQL:写法:字段1 = 'xxx' or 字段2 in ( 'xxx').....
    mongodb:db.B.find({"$or":[{"x":{"$in":['值1','值2'...]}},{"y":"3"}]})
    
    3.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]}
    
    3.5 $exists 判断文档属性是否存在
    
    db.B.find({"name":{"$exists":true}})   --查找属性name存在的文档
    db.B.find({"name":{"$exists":false}})  --查找属性name不存在的文档
    
    3.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 }
    
    3.7 $not元条件句
    
    可与其他条件配合使用,即不在匹配范围之内的文档,下面可见其用法。
    
    3.8 $mod取模运算
    
    db.B.find({"age":{"$mod":[5,1]}}) --表示查找年龄/5余1的所有文档
    
    若查找年龄/5余1之外的所有文档,可结合$not运算:
    db.B.find({"age":{"$not":{"$mod":[5,1]}}})
    
    3.9 正则表达式
    
    db.B.find({"name":/jack/i})
    
    3.10 $size
    
    > db.C.find()
    { "_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 ] }
    
    3.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
            ]
    }
    
    3.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"查询进行调优,可达到不牺牲性能的要求。
    
    
    4 游标
    
    使用游标返回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 --确保查询的结果是在查询执行那一刻的一致快照
    */
    ?>
    

      

  • 相关阅读:
    启动Jmeter4.0 后弹出命令窗口提示信息是什么意思?
    启动Jmeter4.0 后弹出警告: WARNING: Could not open/create prefs root node SoftwareJavaSoftPrefs at root 0 x80000002. Windows RegCreateKeyEx(...) returned error code 5.
    jmeter报错:响应数据HTTP Status 500 & 后台日志Typed variable declaration : Object constructor
    读书笔记——林达《总统是靠不住的:近距离看美国之二》
    jmeter报错:内存溢出
    jmeter之最佳实践
    perfmon——使用windows系统自带的性能监视器监控进程信息
    jmeter测试文件上传接口报错:connection reset by peer: socket write error
    Linux system V
    Linux 守护进程和超级守护进程(xinetd)
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/2820053.html
Copyright © 2011-2022 走看看