MongoDB从入门到实战(六):MongoDB 查询文档 find

x33g5p2x  于2021-12-25 转载在 Go  
字(9.9k)|赞(0)|评价(0)|浏览(600)

db.collection.find()

查找所有文档

  1. // 查找所有文档,相当于 select * from user
  2. > db.user.find()
  3. // pretty() : 用于美化返回值,每个key:value 各占一行
  4. > db.user.find().pretty()
  5. {
  6. "_id" : 1,
  7. "username" : "a"
  8. }
  9. // find 肯定也支持带条件的查询, 相当于select * from user where username = 'a'
  10. > db.user.find({"username": "a"})
  11. { "_id" : 2, "username" : "a" }
  12. // 查询指定字段,1:代表要查询的字段,0:代表不要查询的字段
  13. // select username from user where username = 'a'
  14. > db.user.find({"username": "a"}, {"_id": 0, "username": 1})
  15. { "username" : "a" }
  16. { "username" : "a" }

db.collection.findOne()

查询满足条件的第一条记录。

  1. // select * from user limit 1
  2. > db.user.findOne()
  3. { "_id" : 1, "username" : "a" }
  4. > db.user.find()
  5. { "_id" : 1, "username" : "a" }
  6. { "_id" : 2, "username" : "a" }
  7. // 返回满足条件的第一条
  8. > db.user.findOne({"username": "a"})
  9. { "_id" : 1, "username" : "a" }

比较查询

  • $ lt 小于
  • $ lte 小于等于
  • $ gt 大于
  • $ gte 大于等于
  • $ ne 不等于
  1. // select * from user where _id < 2
  2. > db.user.find({"_id": {"$lt": 2}})
  3. { "_id" : 1, "username" : "a" }
  4. // select * from user where _id > 1
  5. > db.user.find({"_id": {"$gt": 1}})
  6. { "_id" : 2, "username" : "a" }
  7. // 同一个字段多个条件
  8. // select * from user where _id > 1 and _id < 3
  9. > db.user.find({"_id": {"$gt": 1, "$lt": 3}})
  10. { "_id" : 2, "username" : "a" }

$in 和 $nin

  1. // select * from user where _id in (1, 2)
  2. > db.user.find({"_id": {"$in": [1, 2]}})
  3. { "_id" : 1, "username" : "a" }
  4. { "_id" : 2, "username" : "a" }
  5. // select * from user where _id not in (1, 2)
  6. > db.user.find({"_id": {"$nin": [1, 2]}})

$where

通过js函数function 自定义where查询条件,注意$where是不走索引的。

  1. > db.user.find({$where: function() { return this.username == 'xiaohong'}})
  2. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }

$and

and 用于连接多个条件,条件之间是and关系。

  1. // 多个字段条件默认使用and作为连接
  2. > db.user.find({"_id": 1, "username": "xiaohong"})
  3. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }
  4. // 显式使用 and 作为连接条件
  5. > db.user.find({$and: [{"_id": 1}, {"username": "xiaohong"}]})
  6. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }

$or

or 用于连接多个条件,条件之间使用or关系。

  1. > db.user.find({$or: [{"_id": 2}, {"username": "xiaohong"}]})
  2. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }
  3. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "money", "xiaojiejie" ] }

$and 和 $or

  1. // select * from user where _id = 1 and (username = 'xiaohong' or hobby 包含 'money')
  2. > db.user.find({"_id": 1, $or: [{"username": "xiaohong"}, {"hobby": "money"}]})
  3. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }

正则表达式和数组

  1. > db.user.remove({})
  2. > db.user.insertMany([{ "_id" : 1, "username" : "xiaohong" },{ "_id" : 2, "username" : "xiaoming" }, { "_id" : 3, "username" : "mingMING" }])
  3. { "acknowledged" : true, "insertedIds" : [ 1, 2, 3 ] }
  4. // /^/表示以什么开头,即右模糊,相当于 select * from user where username like 'xiao%'
  5. > db.user.find({"username": /^xiao/})
  6. { "_id" : 1, "username" : "xiaohong" }
  7. { "_id" : 2, "username" : "xiaoming" }
  8. // /$/表示以什么结束,即左模糊,相当于 select * from user where username like '%ming'
  9. > db.user.find({"username": /ming$/})
  10. { "_id" : 2, "username" : "xiaoming" }
  11. // i : 表示忽略大小写
  12. > db.user.find({"username": /ming$/i})
  13. { "_id" : 2, "username" : "xiaoming" }
  14. { "_id" : 3, "username" : "mingMING" }
  15. // 左右模糊,select * from user where username like '%mi%'
  16. > db.user.find({"username": /mi/})
  17. { "_id" : 2, "username" : "xiaoming" }
  18. { "_id" : 3, "username" : "mingMING" }
  19. // 正则表达式用于数组
  20. > db.user.find()
  21. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }
  22. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "money", "xiaojiejie" ] }
  23. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  24. > db.user.find({"hobby": /xiaojiejie/})
  25. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "money", "xiaojiejie" ] }
  26. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  27. // 正则表达式中包含变量需要使用eval()函数
  28. > var ele = "xiaojiejie"
  29. > db.user.find({"hobby": eval("/" + ele + "/")})
  30. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "money", "xiaojiejie" ] }
  31. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  1. // 条件字段如果是数组,条件值为一个元素表示是否包含,包含该元素就查询出来
  2. > db.user.find({"hobby": "xiaojiejie"})
  3. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "money", "xiaojiejie" ] }
  4. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  5. // 条件字段如果是数组,条件值为一个数组,此时表示的是精确匹配,不是包含关系
  6. > db.user.find({"hobby": ["xiaojiejie"]})
  7. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  8. // 数组中同时包含多个元素需要使用修饰符 $all
  9. > db.user.find({"hobby": {"$all": ["xiaojiejie", "money"]}})
  10. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "money", "xiaojiejie" ] }
  11. // 使用下标作为数组条件,表示第i个元素的值是指定值的文档
  12. > db.user.find({"hobby.0": "xiaojiejie"})
  13. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  14. // 根据数组元素个数作为查询条件
  15. > db.user.find({"hobby": {"$size": 1}})
  16. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }
  17. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  18. // 获取数组中的前几个值,正数表示从前面开始获取
  19. > db.user.find({}, {"hobby": {$slice: 1}})
  20. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }
  21. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "money" ] }
  22. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  23. // 获取数组中的后面几个值,负数表示从后开始获取
  24. > db.user.find({}, {"hobby": {$slice: -1}})
  25. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }
  26. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "xiaojiejie" ] }
  27. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  28. // [index, count] 从第几个元素开始获取,获取几个元素
  29. > db.user.find({}, {"hobby": {$slice: [0, 2]}})
  30. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }
  31. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "money", "xiaojiejie" ] }
  32. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  33. // $elemMatch: 数组中是否有一个元素同时满足所有条件(只要有一个元素满足就能匹配上)
  34. > db.xyz.find({"x": {"$elemMatch": {"$gt": 3,"$lt": 6}}})
  35. { "_id" : 1, "x" : [ 2, 5 ] }
  36. { "_id" : 2, "x" : [ 4, 5 ] }
  37. { "_id" : 3, "x" : [ 4, 10 ] }
  38. // 根据字段类型作为条件,2表示字符串类型
  39. > db.coll.insertMany([{"x": "abc", "y": "10"}, {"x": 6, y: null}, {"x": new Date()}])
  40. > db.coll.find({"x": {"$type": 2}})
  41. { "_id" : ObjectId("6073bb24daa0d45856bee570"), "x" : "abc", "y" : "10" }
  42. // 字段的值为null或者没有该字段都会被视作null
  43. > db.coll.find({"y": null})
  44. { "_id" : ObjectId("6073bb24daa0d45856bee571"), "x" : 6, "y" : null }
  45. { "_id" : ObjectId("6073bb24daa0d45856bee572"), "x" : ISODate("2021-04-12T03:14:44.376Z") }
  46. // 查询字段为null,并且存在该字段
  47. > db.coll.find({"y": {"$in": [null], "$exists": true}})
  48. { "_id" : ObjectId("6073bb24daa0d45856bee571"), "x" : 6, "y" : null }

distinct

获取某个字段所有不重复的值。

  1. // select distinct id from user
  2. > db.user.distinct("_id")
  3. [ 1, 2, 3 ]

count

查询满足条件的文档总数量

  1. // select count(*) from usesr
  2. > db.user.find().count()
  3. 3

limit

返回满足条件的前N条文档。

  1. > db.user.find()
  2. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }
  3. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "money", "xiaojiejie" ] }
  4. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }
  5. // select * from user limit 2
  6. > db.user.find().limit(2)
  7. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }
  8. { "_id" : 2, "username" : "xiaoming", "hobby" : [ "money", "xiaojiejie" ] }

skip

skip 跳过前N条文档,从第N + 1条开始取,skip和limit结合就是分页。

  1. // select * from user limit 2, 1
  2. > db.user.find().skip(2).limit(1)
  3. { "_id" : 3, "username" : "mingMING", "hobby" : [ "xiaojiejie" ] }

sort

sort 排序,1表示升续,-1表示降续。

skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关。

  1. // select * from user order by id desc limit 2, 1
  2. > db.user.find().sort({"_id": -1}).skip(2).limit(1)
  3. { "_id" : 1, "username" : "xiaohong", "hobby" : [ "dog" ] }

相关文章