$elemMatch

语法

  1. { <字段名1>: { $elemMatch: <表达式1> }, <字段名2>: { $elemMatch: <表达式2> }, ... }

描述

返回数组内满足条件的元素的集合,或者嵌套对象中满足条件的子对象。

其中“<表达式>”可以是值,也可以是带有匹配符的表达式,“$elemMatch”匹配符支持多层嵌套。

示例

在集合 foo.bar 插入 3 条记录,两条是数组类型,一条是嵌套对象类型

  1. > db.foo.bar.insert( { "_id": 1, "class": 1, "students": [ { "name": "ZhangSan", "age": 18 }, { "name": "LiSi", "age": 19 }, { "name": "WangErmazi", "age": 18 } ] } )
  2. > db.foo.bar.insert( { "_id": 2, "class": 2, "students": { "name": "LinWu", "age": 18 } } )
  3. > db.foo.bar.insert( { "_id": 3, "class": 3, "students": [ { "name": "ZhangSan", "age": 18, course: [ { math: 1 }, { english: 0 } ] }, { "name": "LiSi", "age": 19, course: [ { math: 1 }, { english: 1 } ] }, { "name": "WangErmazi", "age": 18, course: [ { math: 0 }, { english: 0 } ] } ] } )
  4. > db.foo.bar.find()
  5. {
  6. "_id": 1,
  7. "class": 1,
  8. "students": [
  9. {
  10. "name": "ZhangSan",
  11. "age": 18
  12. },
  13. {
  14. "name": "LiSi",
  15. "age": 19
  16. },
  17. {
  18. "name": "WangErmazi",
  19. "age": 18
  20. }
  21. ]
  22. }
  23. {
  24. "_id": 2,
  25. "class": 2,
  26. "students": {
  27. "name": "LinWu",
  28. "age": 18
  29. }
  30. }
  31. {
  32. "_id": 3,
  33. "class": 3,
  34. "students": [
  35. {
  36. "name": "ZhangSan",
  37. "age": 18,
  38. "course": [
  39. {
  40. "math": 1
  41. },
  42. {
  43. "english": 0
  44. }
  45. ]
  46. },
  47. {
  48. "name": "LiSi",
  49. "age": 19,
  50. "course": [
  51. {
  52. "math": 1
  53. },
  54. {
  55. "english": 1
  56. }
  57. ]
  58. },
  59. {
  60. "name": "WangErmazi",
  61. "age": 18,
  62. "course": [
  63. {
  64. "math": 0
  65. },
  66. {
  67. "english": 0
  68. }
  69. ]
  70. }
  71. ]
  72. }
  73. Return 3 row(s).

SequoiaDB shell 运行如下:

  • 指定返回“age”等于 18 的元素:
  1. > db.foo.bar.find( {}, { "students": { "$elemMatch": { "age": 18 } } } )
  2. {
  3. "_id": 1,
  4. "class": 1,
  5. "students": [
  6. {
  7. "name": "ZhangSan",
  8. "age": 18
  9. },
  10. {
  11. "name": "WangErmazi",
  12. "age": 18
  13. }
  14. ]
  15. }
  16. {
  17. "_id": 2,
  18. "class": 2,
  19. "students": {
  20. "name": "LinWu",
  21. "age": 18
  22. }
  23. }
  24. {
  25. "_id": 3,
  26. "class": 3,
  27. "students": [
  28. {
  29. "name": "ZhangSan",
  30. "age": 18,
  31. "course": [
  32. {
  33. "math": 1
  34. },
  35. {
  36. "english": 0
  37. }
  38. ]
  39. },
  40. {
  41. "name": "WangErmazi",
  42. "age": 18,
  43. "course": [
  44. {
  45. "math": 0
  46. },
  47. {
  48. "english": 0
  49. }
  50. ]
  51. }
  52. ]
  53. }
  54. Return 3 row(s).
  • 指定返回“age”大于 18 的元素,使用“$gt”表达式:
  1. > db.foo.bar.find( { "class": 1 }, { "students": { "$elemMatch": { "age": { $gt: 18 } } } } )
  2. {
  3. "_id": 1,
  4. "class": 1,
  5. "students": [
  6. {
  7. "name": "LiSi",
  8. "age": 19
  9. }
  10. ]
  11. }
  12. Return 1 row(s).
  • 指定返回姓“Wang”的元素,使用“$regex”表达式:
  1. > db.foo.bar.find( { "class": 1 }, { "students": { "$elemMatch": { "name": { $regex: "^Wang.*" } } } } )
  2. {
  3. "_id": 1,
  4. "class": 1,
  5. "students": [
  6. {
  7. "name": "WangErmazi",
  8. "age": 18
  9. }
  10. ]
  11. }
  12. Return 1 row(s).
  • 指定返回 3 班学生数组中选择了数学的元素,使用嵌套的“$elemMatch”表达式:
  1. > db.foo.bar.find( { class: 3 }, { students: { $elemMatch: { course: { $elemMatch: { math: 1 } } } } } )
  2. {
  3. "_id": 3,
  4. "class": 3,
  5. "students": [
  6. {
  7. "name": "ZhangSan",
  8. "age": 18,
  9. "course": [
  10. {
  11. "math": 1
  12. },
  13. {
  14. "english": 0
  15. }
  16. ]
  17. },
  18. {
  19. "name": "LiSi",
  20. "age": 19,
  21. "course": [
  22. {
  23. "math": 1
  24. },
  25. {
  26. "english": 1
  27. }
  28. ]
  29. }
  30. ]
  31. }
  32. Return 1 row(s).