当前位置:Gxlcms > PHP教程 > mongodb如何对子文档进行分页

mongodb如何对子文档进行分页

时间:2021-07-01 10:21:17 帮助过:18人阅读

文档结构如下:

  1. <code>{
  2. "_id" : ObjectId("55dc145ef754a3342000002d"),
  3. "id" : 12,
  4. "title" : "炎炎夏日,跟我一起High翻天!",
  5. "content" : "酷暑7月,简直不能忍~~~!夏天。就应该是被西瓜,冰镇可乐,全家桶,空调和游戏包围着的天堂。外面的世界纷纷扰扰与我无关~~哇哈哈哈!!",
  6. "thumb" : "/201506/5592560017b6a.jpg",
  7. "banner" : "/201506/559255fa5366d.jpg",
  8. "order" : 11,
  9. "publish_time" : "2015-08-25",
  10. "game_num" : 14,
  11. "games" : [
  12. {
  13. "id" : 1128,
  14. "name_zh" : "追击野兽",
  15. "apk_size" : "38.15M",
  16. "apk_version_name" : "1.0.6",
  17. "apk_package_name" : "com.miniclip.beastquest",
  18. "apk_version_code" : "18",
  19. "game_rank" : 8,
  20. "customize_update_time" : "2015-05-18 00:00:00",
  21. },
  22. {
  23. "id" : 3276,
  24. "name_zh" : "世界僵尸大联盟",
  25. "apk_size" : "33.88M",
  26. "apk_version_name" : "3.3.3237",
  27. "apk_package_name" : "com.proletariat.worldzombination",
  28. "apk_version_code" : "33537",
  29. "game_rank" : 8,
  30. "customize_update_time" : "2015-05-15 00:00:00",
  31. },
  32. {
  33. "id" : 3416,
  34. "name_zh" : "围剿外星客",
  35. "apk_size" : "38.69M",
  36. "apk_version_name" : "1.7.1",
  37. "apk_package_name" : "com.outplayentertainment.aliencreeps",
  38. "apk_version_code" : "10070010",
  39. "game_rank" : 8,
  40. "customize_update_time" : "2015-04-25 00:00:00",
  41. },
  42. {
  43. "id" : 10357,
  44. "name_zh" : "合金弹头:防御",
  45. "apk_size" : "47.13M",
  46. "apk_version_name" : "1.27.0",
  47. "apk_package_name" : "com.snkplaymore.android003",
  48. "apk_version_code" : "52",
  49. "game_rank" : 8,
  50. "customize_update_time" : "0000-00-00 00:00:00",
  51. },
  52. {
  53. "id" : 10360,
  54. "name_zh" : "绿色忍者蛙年",
  55. "apk_size" : "47.7M",
  56. "apk_version_name" : "4",
  57. "apk_package_name" : "com.nitrome.greenninja",
  58. "apk_version_code" : "4",
  59. "game_rank" : 8,
  60. "customize_update_time" : "2015-06-30 15:52:10",
  61. },
  62. {
  63. "id" : 10364,
  64. "name_zh" : "杀死马里奥",
  65. "apk_size" : "31.16M",
  66. "apk_version_name" : "1.0.6",
  67. "apk_package_name" : "air.com.keybol.plumber",
  68. "apk_version_code" : "1000006",
  69. "game_rank" : 7,
  70. "customize_update_time" : "2015-06-30 16:08:09",
  71. },
  72. {
  73. "id" : 10366,
  74. "name_zh" : "通过繁殖征服世界",
  75. "apk_size" : "44.83M",
  76. "apk_version_name" : "1.0.2",
  77. "apk_package_name" : "com.kt.SpermWarWorldWide_G",
  78. "apk_version_code" : "10002",
  79. "game_rank" : 8,
  80. "customize_update_time" : "2015-06-30 16:21:22",
  81. },
  82. {
  83. "id" : 10229,
  84. "name_zh" : "冰块切割",
  85. "apk_size" : "7.14M",
  86. "apk_version_name" : "2.4.6",
  87. "apk_package_name" : "com.hyperkani.sliceice",
  88. "apk_version_code" : "30",
  89. "game_rank" : 7,
  90. "customize_update_time" : "2014-11-04 00:00:00",
  91. },
  92. {
  93. "id" : 10356,
  94. "name_zh" : "吃冰淇淋的怪房子",
  95. "apk_size" : "33.56M",
  96. "apk_version_name" : "1.0.2",
  97. "apk_package_name" : "com.firedroid.icecreamnomsters",
  98. "apk_version_code" : "4",
  99. "game_rank" : 8,
  100. "customize_update_time" : "0000-00-00 00:00:00",
  101. },
  102. {
  103. "id" : 10358,
  104. "name_zh" : "来杯果汁",
  105. "apk_size" : "42.11M",
  106. "apk_version_name" : "1.6.21",
  107. "apk_package_name" : "air.com.sgn.juicejam.gp",
  108. "apk_version_code" : "1006021",
  109. "game_rank" : 6,
  110. "customize_update_time" : "0000-00-00 00:00:00",
  111. },
  112. {
  113. "id" : 10362,
  114. "name_zh" : "梦游先生",
  115. "apk_size" : "48.52M",
  116. "apk_version_name" : "1.00",
  117. "apk_package_name" : "com.BEbit.MrSnoozleberg",
  118. "apk_version_code" : "1",
  119. "game_rank" : 8,
  120. "customize_update_time" : "2015-06-30 15:58:13",
  121. },
  122. {
  123. "id" : 10363,
  124. "name_zh" : "清凉方冰冰",
  125. "apk_size" : "23.14M",
  126. "apk_version_name" : "1.1",
  127. "apk_package_name" : "com.unilever.CoolCubeszzc",
  128. "apk_version_code" : "2",
  129. "game_rank" : 6,
  130. "customize_update_time" : "2015-06-30 16:04:56",
  131. },
  132. {
  133. "id" : 10365,
  134. "name_zh" : "嗜血狂鲨2",
  135. "apk_size" : "9.9M",
  136. "apk_version_name" : "2.6.1",
  137. "apk_package_name" : "com.fgol.shark2",
  138. "apk_version_code" : "13",
  139. "game_rank" : 8,
  140. "customize_update_time" : "2015-06-30 16:15:58",
  141. },
  142. {
  143. "id" : 10367,
  144. "name_zh" : "外星人爱牛奶",
  145. "apk_size" : "23.86M",
  146. "apk_version_name" : "1.0.7",
  147. "apk_package_name" : "air.com.rightfusion.alienslikemilk",
  148. "apk_version_code" : "1000007",
  149. "game_rank" : 8,
  150. "customize_update_time" : "2015-06-30 16:28:17",
  151. }
  152. ]
  153. }</code>

如何对子文档games进行分页查询
比如一次只取3条数据

  1. <code>{
  2. "id" : 1128,
  3. "name_zh" : "追击野兽",
  4. "apk_size" : "38.15M",
  5. "apk_version_name" : "1.0.6",
  6. "apk_package_name" : "com.miniclip.beastquest",
  7. "apk_version_code" : "18",
  8. "game_rank" : 8,
  9. "customize_update_time" : "2015-05-18 00:00:00",
  10. },
  11. {
  12. "id" : 3276,
  13. "name_zh" : "世界僵尸大联盟",
  14. "apk_size" : "33.88M",
  15. "apk_version_name" : "3.3.3237",
  16. "apk_package_name" : "com.proletariat.worldzombination",
  17. "apk_version_code" : "33537",
  18. "game_rank" : 8,
  19. "customize_update_time" : "2015-05-15 00:00:00",
  20. },
  21. {
  22. "id" : 3416,
  23. "name_zh" : "围剿外星客",
  24. "apk_size" : "38.69M",
  25. "apk_version_name" : "1.7.1",
  26. "apk_package_name" : "com.outplayentertainment.aliencreeps",
  27. "apk_version_code" : "10070010",
  28. "game_rank" : 8,
  29. "customize_update_time" : "2015-04-25 00:00:00",
  30. }
  31. }</code>

回复内容:

文档结构如下:

  1. <code>{
  2. "_id" : ObjectId("55dc145ef754a3342000002d"),
  3. "id" : 12,
  4. "title" : "炎炎夏日,跟我一起High翻天!",
  5. "content" : "酷暑7月,简直不能忍~~~!夏天。就应该是被西瓜,冰镇可乐,全家桶,空调和游戏包围着的天堂。外面的世界纷纷扰扰与我无关~~哇哈哈哈!!",
  6. "thumb" : "/201506/5592560017b6a.jpg",
  7. "banner" : "/201506/559255fa5366d.jpg",
  8. "order" : 11,
  9. "publish_time" : "2015-08-25",
  10. "game_num" : 14,
  11. "games" : [
  12. {
  13. "id" : 1128,
  14. "name_zh" : "追击野兽",
  15. "apk_size" : "38.15M",
  16. "apk_version_name" : "1.0.6",
  17. "apk_package_name" : "com.miniclip.beastquest",
  18. "apk_version_code" : "18",
  19. "game_rank" : 8,
  20. "customize_update_time" : "2015-05-18 00:00:00",
  21. },
  22. {
  23. "id" : 3276,
  24. "name_zh" : "世界僵尸大联盟",
  25. "apk_size" : "33.88M",
  26. "apk_version_name" : "3.3.3237",
  27. "apk_package_name" : "com.proletariat.worldzombination",
  28. "apk_version_code" : "33537",
  29. "game_rank" : 8,
  30. "customize_update_time" : "2015-05-15 00:00:00",
  31. },
  32. {
  33. "id" : 3416,
  34. "name_zh" : "围剿外星客",
  35. "apk_size" : "38.69M",
  36. "apk_version_name" : "1.7.1",
  37. "apk_package_name" : "com.outplayentertainment.aliencreeps",
  38. "apk_version_code" : "10070010",
  39. "game_rank" : 8,
  40. "customize_update_time" : "2015-04-25 00:00:00",
  41. },
  42. {
  43. "id" : 10357,
  44. "name_zh" : "合金弹头:防御",
  45. "apk_size" : "47.13M",
  46. "apk_version_name" : "1.27.0",
  47. "apk_package_name" : "com.snkplaymore.android003",
  48. "apk_version_code" : "52",
  49. "game_rank" : 8,
  50. "customize_update_time" : "0000-00-00 00:00:00",
  51. },
  52. {
  53. "id" : 10360,
  54. "name_zh" : "绿色忍者蛙年",
  55. "apk_size" : "47.7M",
  56. "apk_version_name" : "4",
  57. "apk_package_name" : "com.nitrome.greenninja",
  58. "apk_version_code" : "4",
  59. "game_rank" : 8,
  60. "customize_update_time" : "2015-06-30 15:52:10",
  61. },
  62. {
  63. "id" : 10364,
  64. "name_zh" : "杀死马里奥",
  65. "apk_size" : "31.16M",
  66. "apk_version_name" : "1.0.6",
  67. "apk_package_name" : "air.com.keybol.plumber",
  68. "apk_version_code" : "1000006",
  69. "game_rank" : 7,
  70. "customize_update_time" : "2015-06-30 16:08:09",
  71. },
  72. {
  73. "id" : 10366,
  74. "name_zh" : "通过繁殖征服世界",
  75. "apk_size" : "44.83M",
  76. "apk_version_name" : "1.0.2",
  77. "apk_package_name" : "com.kt.SpermWarWorldWide_G",
  78. "apk_version_code" : "10002",
  79. "game_rank" : 8,
  80. "customize_update_time" : "2015-06-30 16:21:22",
  81. },
  82. {
  83. "id" : 10229,
  84. "name_zh" : "冰块切割",
  85. "apk_size" : "7.14M",
  86. "apk_version_name" : "2.4.6",
  87. "apk_package_name" : "com.hyperkani.sliceice",
  88. "apk_version_code" : "30",
  89. "game_rank" : 7,
  90. "customize_update_time" : "2014-11-04 00:00:00",
  91. },
  92. {
  93. "id" : 10356,
  94. "name_zh" : "吃冰淇淋的怪房子",
  95. "apk_size" : "33.56M",
  96. "apk_version_name" : "1.0.2",
  97. "apk_package_name" : "com.firedroid.icecreamnomsters",
  98. "apk_version_code" : "4",
  99. "game_rank" : 8,
  100. "customize_update_time" : "0000-00-00 00:00:00",
  101. },
  102. {
  103. "id" : 10358,
  104. "name_zh" : "来杯果汁",
  105. "apk_size" : "42.11M",
  106. "apk_version_name" : "1.6.21",
  107. "apk_package_name" : "air.com.sgn.juicejam.gp",
  108. "apk_version_code" : "1006021",
  109. "game_rank" : 6,
  110. "customize_update_time" : "0000-00-00 00:00:00",
  111. },
  112. {
  113. "id" : 10362,
  114. "name_zh" : "梦游先生",
  115. "apk_size" : "48.52M",
  116. "apk_version_name" : "1.00",
  117. "apk_package_name" : "com.BEbit.MrSnoozleberg",
  118. "apk_version_code" : "1",
  119. "game_rank" : 8,
  120. "customize_update_time" : "2015-06-30 15:58:13",
  121. },
  122. {
  123. "id" : 10363,
  124. "name_zh" : "清凉方冰冰",
  125. "apk_size" : "23.14M",
  126. "apk_version_name" : "1.1",
  127. "apk_package_name" : "com.unilever.CoolCubeszzc",
  128. "apk_version_code" : "2",
  129. "game_rank" : 6,
  130. "customize_update_time" : "2015-06-30 16:04:56",
  131. },
  132. {
  133. "id" : 10365,
  134. "name_zh" : "嗜血狂鲨2",
  135. "apk_size" : "9.9M",
  136. "apk_version_name" : "2.6.1",
  137. "apk_package_name" : "com.fgol.shark2",
  138. "apk_version_code" : "13",
  139. "game_rank" : 8,
  140. "customize_update_time" : "2015-06-30 16:15:58",
  141. },
  142. {
  143. "id" : 10367,
  144. "name_zh" : "外星人爱牛奶",
  145. "apk_size" : "23.86M",
  146. "apk_version_name" : "1.0.7",
  147. "apk_package_name" : "air.com.rightfusion.alienslikemilk",
  148. "apk_version_code" : "1000007",
  149. "game_rank" : 8,
  150. "customize_update_time" : "2015-06-30 16:28:17",
  151. }
  152. ]
  153. }</code>

如何对子文档games进行分页查询
比如一次只取3条数据

  1. <code>{
  2. "id" : 1128,
  3. "name_zh" : "追击野兽",
  4. "apk_size" : "38.15M",
  5. "apk_version_name" : "1.0.6",
  6. "apk_package_name" : "com.miniclip.beastquest",
  7. "apk_version_code" : "18",
  8. "game_rank" : 8,
  9. "customize_update_time" : "2015-05-18 00:00:00",
  10. },
  11. {
  12. "id" : 3276,
  13. "name_zh" : "世界僵尸大联盟",
  14. "apk_size" : "33.88M",
  15. "apk_version_name" : "3.3.3237",
  16. "apk_package_name" : "com.proletariat.worldzombination",
  17. "apk_version_code" : "33537",
  18. "game_rank" : 8,
  19. "customize_update_time" : "2015-05-15 00:00:00",
  20. },
  21. {
  22. "id" : 3416,
  23. "name_zh" : "围剿外星客",
  24. "apk_size" : "38.69M",
  25. "apk_version_name" : "1.7.1",
  26. "apk_package_name" : "com.outplayentertainment.aliencreeps",
  27. "apk_version_code" : "10070010",
  28. "game_rank" : 8,
  29. "customize_update_time" : "2015-04-25 00:00:00",
  30. }
  31. }</code>

  1. <code>> db.test1.find().pretty()
  2. {
  3. "_id" : ObjectId("55dc145ef754a3342000002d"),
  4. "games" : [
  5. {
  6. "id" : 1128,
  7. "name_zh" : "追击野兽",
  8. "customize_update_time" : "2015-05-18 00:00:00"
  9. },
  10. {
  11. "id" : 3276,
  12. "name_zh" : "dasda",
  13. "customize_update_time" : "2015-05-15 00:00:00"
  14. },
  15. {
  16. "id" : 3416,
  17. "name_zh" : "围剿外星客",
  18. "customize_update_time" : "2015-04-25 00:00:00"
  19. },
  20. {
  21. "id" : 10357,
  22. "name_zh" : "合金弹头:防御",
  23. "customize_update_time" : "0000-00-00 00:00:00"
  24. },
  25. {
  26. "id" : 10360,
  27. "name_zh" : "绿色忍者蛙年",
  28. "customize_update_time" : "2015-06-30 15:52:10"
  29. },
  30. {
  31. "id" : 10364,
  32. "name_zh" : "杀死马里奥",
  33. "customize_update_time" : "2015-06-30 16:08:09"
  34. },
  35. {
  36. "id" : 10366,
  37. "name_zh" : "通过繁殖征服世界",
  38. "customize_update_time" : "2015-06-30 16:21:22"
  39. },
  40. {
  41. "id" : 10229,
  42. "name_zh" : "冰块切割",
  43. "customize_update_time" : "2014-11-04 00:00:00"
  44. },
  45. {
  46. "id" : 10356,
  47. "name_zh" : "吃冰淇淋的怪房子",
  48. "customize_update_time" : "0000-00-00 00:00:00"
  49. },
  50. {
  51. "id" : 10358,
  52. "name_zh" : "来杯果汁",
  53. "customize_update_time" : "0000-00-00 00:00:00"
  54. },
  55. {
  56. "id" : 10362,
  57. "name_zh" : "梦游先生",
  58. "customize_update_time" : "2015-06-30 15:58:13"
  59. },
  60. {
  61. "id" : 10363,
  62. "name_zh" : "清凉方冰冰",
  63. "customize_update_time" : "2015-06-30 16:04:56"
  64. },
  65. {
  66. "id" : 10365,
  67. "name_zh" : "嗜血狂鲨2",
  68. "customize_update_time" : "2015-06-30 16:15:58"
  69. },
  70. {
  71. "id" : 10367,
  72. "name_zh" : "外星人爱牛奶",
  73. "customize_update_time" : "2015-06-30 16:28:17"
  74. }
  75. ]
  76. }</code>

取games的前3条数据:

  1. <code>> db.test1.find({"_id" : ObjectId("55dc145ef754a3342000002d")},{"games":{ "$slice":[0,3]}}).pretty()
  2. {
  3. "_id" : ObjectId("55dc145ef754a3342000002d"),
  4. "games" : [
  5. {
  6. "id" : 1128,
  7. "name_zh" : "追击野兽",
  8. "customize_update_time" : "2015-05-18 00:00:00"
  9. },
  10. {
  11. "id" : 3276,
  12. "name_zh" : "dasda",
  13. "customize_update_time" : "2015-05-15 00:00:00"
  14. },
  15. {
  16. "id" : 3416,
  17. "name_zh" : "围剿外星客",
  18. "customize_update_time" : "2015-04-25 00:00:00"
  19. }
  20. ]
  21. }</code>

取第四条到第6条数据:

  1. <code>> db.test1.find({"_id" : ObjectId("55dc145ef754a3342000002d")},{"games":{ "$slice":[3,3]}}).pretty()
  2. {
  3. "_id" : ObjectId("55dc145ef754a3342000002d"),
  4. "games" : [
  5. {
  6. "id" : 10357,
  7. "name_zh" : "合金弹头:防御",
  8. "customize_update_time" : "0000-00-00 00:00:00"
  9. },
  10. {
  11. "id" : 10360,
  12. "name_zh" : "绿色忍者蛙年",
  13. "customize_update_time" : "2015-06-30 15:52:10"
  14. },
  15. {
  16. "id" : 10364,
  17. "name_zh" : "杀死马里奥",
  18. "customize_update_time" : "2015-06-30 16:08:09"
  19. }
  20. ]
  21. }</code>

依次类推,即可。 "$slice":[3,3] 第一个3表示查询数组下标的起始位置,第二个3表示取的数据条数。建议games不要过多,不然会超出文档限制16M。不过这个可能是设计问题,我多想了。

第二种方法:就是用代码从数据库中取出来,将games里面的每一个子文档封装成model,放在缓存中做分页,而不是数据库级别的分页也可实现

第三种方法:从数据可看出games里面的子文档是按照id进行排序的,那么也就是说子文档是可比较的,那么就可以使用$gt和$lt,接合$size取数据,我没有试。你可以尝试一下。不过$slice获取数组子集更方便一点。

用limit(n)可以限制只获取n条数据。skip(n)可以跳过n条数据,两者结合可以实现分页吧?不过skip比较消耗资源少用为妙。

人气教程排行