MongoDB查询


以下查询以表名为:student为例,表数据格式

/* 1 */
{
    "_id" : ObjectId("5ba0964680c36a8a91067d53"),
    "name" : "jim",
    "age" : 25.0,
    "email" : "75431457@qq.com",
    "c" : 89.0,
    "m" : 96.0,
    "e" : 87.0,
    "country" : "USA",
    "books" : [ 
        "JS", 
        "C++", 
        "EXTJS", 
        "MONGODB"
    ]
}

/* 2 */
{
    "_id" : ObjectId("5ba0964680c36a8a91067d54"),
    "name" : "tom",
    "age" : 25.0,
    "email" : "214557457@qq.com",
    "c" : 75.0,
    "m" : 66.0,
    "e" : 97.0,
    "country" : "USA",
    "books" : [ 
        "PHP", 
        "JAVA", 
        "EXTJS", 
        "C++"
    ]
}
返回指定的键

db.student.find({查询条件},{field:value}) value:1 返回 0:不返回 例如:db.student.find({},{name:1})

查询条件
比较运算符
运算符含义事例
$lt<{age:{$gte:22,$lte:27}}
$lte<=
$gt>
$gte>=
$ne!={age:{$ne:26}}
  1. 运算符使用
    1.1. 查询年龄在25岁到27岁之间,国籍为USA的学生

    db.student.find(
        {
           age:{$gte:25,$lte:27},
           country:"USA"
        }
      )
    

    1.2 查询出所有不是USA的学生数学成绩

    db.student.find(
        {
           country:{$ne:"USA"}
        },
        {
           "m":1,
            "country":1
        }
      )
    
  2. 包含或者不包含($in 或 $nin)
    2.1 查询国籍是China或USA的学生信息

    db.student.find(
        {
           country:{$in:["USA","China"]}
        }
      )
    

    2.2 查询国籍不是China或者USA的学生信息
    db.student.find( { country:{$nin:["USA","China"]} } )

  3. OR查询
    3.1 查询语文成绩大于85或者英语大于90的信息且国籍为USA的信息

    db.student.find(
        {
            $or:[{c:{$gte:85}},{e:{$gte:90}}],
            country:"USA"
        },
        {
            _id:0,
            c:1,
            e:1,
            country:1
        }
     )
    
  4. Null
    查询国籍为Null的信息
    db.persons.find({country:{$in:[null]}},{country:1})

  5. 正则查询
    查询出名字中存在"li"的信息
    db.persons.find({name:/li/i},{country:1})

  6. $not
    查询出名字中不存在"li"的信息
    db.persons.find({name:{\$not:/li/i}},{country:1})

  7. 数组查询
    7.1 查询喜欢MONGODB和JS的学生

     db.student.find(
        {
            books:{$all:["JS","MONGODB"]}
        },
        {
            _id:0,
            books:1,
            name:1
        }
     )
    

    7.2 查询第二本书是JAVA的数据
    用索引做

    db.student.find(
        {
            "books.1":"JAVA"
        },
        {
            _id:0,
            books:1,
            name:1
        }
     )
    
  8. $size 不能与比较查询一起使用
    8.1 查询指定长度的数组为4
    db.student.find( { books:{$size:4} }, { _id:0, books:1, name:1 } )
    8.2 利用shell查询出Jim喜欢看书的数量

    var student = db.student.find({name:"jim"})
    while(student.hasNext()){
    	obj = student.next();
         print(obj.books.length)
    }
    
    1. $slice操作符返回文档中指定数组的内部值
      9.1 查询出 lixiaoli书架中第2~4本书

       db.student.find(
          {
              name:"lixiaoli"
             
          },
          {
              books:{"$slice":[1,3]},
              _id:0,
              name:1
          }
       )
      

      9.2 查询出 lixiaoli书架中最后一本书

       db.student.find(
          {
              name:"lixiaoli"
             
          },
          {
              books:{"$slice":-1},
              _id:0,
              name:1
          }
       )
      
    2. 文档查询 $elemMatch
      首先为Jim添加学校信息

      var jim = [{
      		school :"K",
      		score:"C"
      	},{
      		school :"L",
      		score:"B"
      	},{
      		school :"J",
      		score:"A"
      	}]
      	db.student.update({name:"jim"},{$set:{school:jim}})
      

      查询School为K 且 score为A的记录

      db.student.find(
      			   {
      			        "school.score":"A","school.school":"K"
      			    },
      			    {
      			        school:1,
      			        name:1
      			     }
      			 )
      			 结果
      			 {
      			    "_id" : ObjectId("5ba0964680c36a8a91067d53"),
      			    "name" : "jim",
      			    "school" : [ 
      			        {
      			            "school" : "K",
      			            "score" : "C"
      			        }, 
      			        {
      			            "school" : "L",
      			            "score" : "B"
      			        }, 
      			        {
      			            "school" : "J",
      			            "score" : "A"
      			        }
      			    ]
      			}
      			显然上述结果是不对的,正确写法如下
      			db.student.find(
      			    {
      			        school:{$elemMatch:{school:"K",score:"A"}}
      			    }
      			 )
      
  9. $where

  10. 分页与排序 limit Skip Sort
    Skip如果数据量巨大的话,Skip的性能会有问题
    查询出第5-8条数据,并以age排序 1:正序 -1:倒序

    db.student.find().limit(3).skip(5).sort({age:1})
    
    若该排序字段的数据类型不统一则排序的优先级为:
    最小值
    null
    数字
    字符串
    对象/文档
    数组
    二进制
    对象ID
    布尔
    日期
     时间戳 -> 正则 ->最大值 
    
  11. 游标

    var students=db.student.find();
    while(students.hasNext()){
        obj=students.next();
        print(obj.name)
     }
    
    a. 游标销毁条件
    1. 客户端发来信息叫他销毁
    2. 游标迭代完毕
    3. 默认游标超过10分钟没用也会别清除
    b.高级查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值