《mongoDB》查询

一:简单查询

  • db.collection.find(query, projection)
      - query :可选,使用查询操作符指定查询条件
      - projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
  • 查询时使用 .pretty() 可以使代码格式化显示,类似于 \G
  • find() 语句不加 QUERY 条件时,默认查询集合文档,默认显示20条
  • 如果只想找到一条记录,请使用 findOne()
    > db.demo.findOne({"name":"lisi"})
    {
        "_id" : ObjectId("5c6158fa2f5e0916de3c790e"),
        "name" : "lisi",
        "age" : 26
    }
  • projection 可以选择字段是否展示 1为展示/0不展示
    find()/findOne()同理
    
    > db.demo.findOne({"name":"lisi"}, {"_id":0,"name":1})
    { "name" : "lisi" }

 

二:查询条件查询

  • 适用的查询条件有
    • $lt    小于
    • $lte  小于等于
    • $gt   大于
    • $gte 大于等于
  • 找到 年龄(age) 小于30 大于25的文档
    > db.demo.find({"age" : {"$lt" : 30, "$gt" : 25}})
    { "_id" : ObjectId("5c6158eb2f5e0916de3c790c"), "name" : "zhangsan", "age" : 26 }
    { "_id" : ObjectId("5c6158fa2f5e0916de3c790d"), "name" : "zhangsan", "age" : 26 }
    { "_id" : ObjectId("5c6158fa2f5e0916de3c790e"), "name" : "lisi", "age" : 26 }
    { "_id" : ObjectId("5c61590f2f5e0916de3c790f"), "name" : "zhangsan", "age" : 26 }
    { "_id" : ObjectId("5c61590f2f5e0916de3c7910"), "name" : "lisi", "age" : 26 }

     

三:OR 查询

  • $in 可以查询一个键的多个值
  • > db.demo.find({"age" : {"$in":[20,26]}})
    { "_id" : ObjectId("5c613f942f5e0916de3c7909"), "age" : 20 }
    { "_id" : ObjectId("5c6158eb2f5e0916de3c790c"), "name" : "zhangsan", "age" : 26 }
    { "_id" : ObjectId("5c6158fa2f5e0916de3c790d"), "name" : "zhangsan", "age" : 26 }
    { "_id" : ObjectId("5c6158fa2f5e0916de3c790e"), "name" : "lisi", "age" : 26 }
    { "_id" : ObjectId("5c61590f2f5e0916de3c790f"), "name" : "zhangsan", "age" : 26 }
    { "_id" : ObjectId("5c61590f2f5e0916de3c7910"), "name" : "lisi", "age" : 26 }
  • OR 更通用,可以查询更多的条件
  • > db.demo.find({"$or" : [{"age" : 20}, {"name":"lihong"}]})
    { "_id" : ObjectId("5c613f942f5e0916de3c7909"), "age" : 20 }
    { "_id" : ObjectId("5c61587a2f5e0916de3c790b"), "name" : "lihong", "age" : 25 }

 

四:null 查询

  • null 的匹配是有些奇怪,不仅仅会匹配某个键为null的文档,还会匹配不包含这个键的文档
  • > db.demo.find({"age" : null})
    { "_id" : ObjectId("5c61011d0a485d689a5f3e15"), "c" : "d" }
    { "_id" : ObjectId("5c6147c92f5e0916de3c790a"), "age" : null }
  • 如果只是想匹配 null 的存在,还需要 使用 exists 来判断键值是否存在
  • db.demo.find({"age" : {"$in" : [null], "$exists" : true}})
    { "_id" : ObjectId("5c6147c92f5e0916de3c790a"), "age" : null }

 

五:数组

  • 数组的查询和标量的查询类似
    • 插入
      > db.demo.insert({"fruit" : ["banana", "apple", "origin"]});
      WriteResult({ "nInserted" : 1 })
    • 查询
      > db.demo.find({"fruit" : "apple"})
      { "_id" : ObjectId("5c6259632f5e0916de3c7912"), "fruit" : [ "banana", "apple", "origin" ] }
  • 匹配多个元素的数组
    • > db.demo.find({"fruit" : {$all :["banana", "apple"]}});
      { "_id" : ObjectId("5c6259632f5e0916de3c7912"), "fruit" : [ "banana", "apple", "origin" ] }
      { "_id" : ObjectId("5c6259de2f5e0916de3c7913"), "fruit" : [ "banana", "apple" ] }
  • 根据数组长度匹配
    • > db.demo.find({"fruit" : {$size : 3}});
      { "_id" : ObjectId("5c6259632f5e0916de3c7912"), "fruit" : [ "banana", "apple", "origin" ] }

六:查询内嵌文档

七:$where 查询

  • 避免使用,英文在查询时需要把文档从 BSON 转为 Javascript 对象操作

八:limit/skip/sort

  • limit
    • limit 指定为上限
    • db.demo.find().limit(3);
  • skip
    • 跳过前 n 个匹配的文档
    • 一次略过过多会导致性能问题,用排序或者其他方法解决
    • db.demo.find().skip(3);
  • sort
    • 接受一对键值对作为排序,1升序/-1降序,如果指定多个键,则按照顺序进行排序
    • > db.demo.find().sort({"age": -1, "name":1});
      { "_id" : ObjectId("5c6158fa2f5e0916de3c790e"), "name" : "lisi", "age" : 26 }
      { "_id" : ObjectId("5c61587a2f5e0916de3c790b"), "name" : "lihong", "age" : 25 }
      { "_id" : ObjectId("5c613f942f5e0916de3c7909"), "age" : 20 }
    • 对于混合数据的比较,由大到小
    • 《mongoDB》查询

       

 

上一篇:MongoDB 概念解析


下一篇:MongoDB高级查询aggregate聚合管道