经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MongoDB » 查看文章
【MongoDB详细使用教程】三、高级查询
来源:cnblogs  作者:cbowen  时间:2019/10/29 10:09:10  对本文有异议

1、使用比较运算符查询

MongoDB 运算
$gt 大于
$lt 小于
$gte 大于等于
$lte 小于等于欧
$ne 不等于
  1. db.集合名.find({"键名": {比较运算符1:值1, 比较运算符2:值2} })
  1. > db.students.find()
  2. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  3. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
  4. { "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级" }
  5. { "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级" }
  6. > db.students.find({"age": {$lt:19}})
  7. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  8. > db.students.find({"age": {$gte:18,$lt:20}})
  9. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  10. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }

2、使用关键字查询

2.1、in/not in 关键字

  1. db.集合名.find({"键名": {$in:[值1, 2, 3 ...]} })
  2. db.集合名.find({"键名": {$nin:[值1, 2, 3 ...]} })
  1. > db.students.find({"age":{$in:[19,18,17]}})
  2. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  3. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
  4. > db.students.find({"age":{$nin:[19,18,17]}})
  5. { "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级" }
  6. { "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级" }

2.2、size 关键字

对于值为list的字段,可以对list的长度(即list当中值的个数)进行判断来查询。

  1. db.集合名.find({"键名": {$size:n} })
  1. > db.students.find()
  2. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  3. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
  4. { "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
  5. { "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }
  6. # 查找text字段长度为3的数据
  7. > db.students.find({"text":{$size:3}})
  8. { "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }

2.3、exists 关键字

查询 包含/不包含 某个字段的数据

  1. db.集合名.find({"键名": {$exist: true|fase} }) # t、f要小写
  1. > db.students.find()
  2. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  3. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
  4. { "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
  5. { "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }
  6. # 查询包含text字段的数据
  7. > db.students.find({"text":{$exists:true}})
  8. { "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
  9. { "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }
  10. # 查询不含text字段的数据
  11. > db.students.find({"text":{$exists:false}})
  12. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  13. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }

2.4、or 关键字

  1. db.集合名.find({$or:[{条件1}, {条件2}, {条件3}...]})
  1. > db.students.find()
  2. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  3. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
  4. { "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
  5. { "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }
  6. # 查询包含text字段或者name=chen的数据
  7. > db.students.find({$or:[{"text":{$exists:true}},{"name":"chen"}]})
  8. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  9. { "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
  10. { "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }

3、模糊查询

  1. db.集合名.find({"键名": js正则表达)
  1. > db.students.find()
  2. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  3. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
  4. { "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }
  5. { "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }
  6. { "_id" : ObjectId("5db68d190f98841018f76970"), "name" : "cheng", "age" : 21, "grade" : "四年级" }
  7. # 查询name以che开头的数据
  8. > db.students.find({"name":/che/})
  9. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  10. { "_id" : ObjectId("5db68d190f98841018f76970"), "name" : "cheng", "age" : 21, "grade" : "四年级" }

4、查询结果排序

  1. db.集合名.find().sort({"键名": 1|-1, "键名": 1|-1...})
  2. 1 为升序
  3. -1 为降序
  1. > db.students.find().sort({"name":1, "age":-1})
  2. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  3. { "_id" : ObjectId("5db68f6c0f98841018f76971"), "name" : "cheng", "age" : 22, "grade" : "五年级" }
  4. { "_id" : ObjectId("5db68d190f98841018f76970"), "name" : "cheng", "age" : 21, "grade" : "四年级" }
  5. { "_id" : ObjectId("5db654660f98841018f7696c"), "name" : "ma", "age" : 20, "grade" : "二年级", "text" : [ "女", "副教授", "副处长" ] }
  6. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
  7. { "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }

5、限定返回结果数量

  1. db.集合名.find().limit(n)
  2. db.集合名.find().skip(n) # 跳过n条,返回从n+1k开始的数据
  3. db.集合名.find().skip(n).limit(m) # 跳过n条,返回后面的m条

.limit() 与 .sort()无先后顺序

  1. # 按age正序排列,并返回前两行数据
  2. > db.students.find().limit(2).sort({"age":1})
  3. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  4. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
  5. > db.students.find().sort({"age":1}).limit(2)
  6. { "_id" : ObjectId("5db642b30f98841018f76965"), "name" : "chen", "age" : 18, "grade" : "一年级" }
  7. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
  8. # 查询age第二小和第三小的数据
  9. > db.students.find().skip(1).limit(2).sort({"age":1})
  10. { "_id" : ObjectId("5db642bc0f98841018f76966"), "name" : "wang", "age" : 19, "grade" : "二年级" }
  11. { "_id" : ObjectId("5db653920f98841018f7696b"), "name" : "xu", "age" : 20, "grade" : "三年级", "text" : [ "女", "研究员" ] }

6、查询返回结果数量

  1. db.集合名.find().count()
  2. db.集合名.find().skip(n).count(true) # 与skip结合使用时,要加true
  1. > db.students.find({"name":"cheng"}).count()
  2. 2
  1. > db.students.find().count()
  2. 6
  3. # 不加true就会统计全部数据条目
  4. > db.students.find().skip(2).count()
  5. 6
  6. > db.students.find().skip(2).count(true)
  7. 4

7、创建索引

  1. db.集合名.ensureIndex({"键名1":1|-1, "键名2":1|-1})
  1. > db.students.ensureIndex({"name":1})
  2. {
  3. "createdCollectionAutomatically" : false,
  4. "numIndexesBefore" : 1,
  5. "numIndexesAfter" : 2,
  6. "ok" : 1
  7. }

原文链接:http://www.cnblogs.com/cbowen/p/11752746.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号