如何使用聚合mongodb从2个集合中获取链接数据

yqhsw0fo  于 2021-10-10  发布在  Java
关注(0)|答案(2)|浏览(526)

我是新来的mongodb,我有两个系列: UserVideo 具有以下结构。当用户喜欢视频时,视频 _id 将添加到 liked_videos 关于用户集合。 liked_videos 是_id的数组
视频采集

  1. {
  2. _id
  3. mp4_url,
  4. liked_count
  5. }

用户集合

  1. {
  2. _id,
  3. username,
  4. password,
  5. liked_videos: [ // videos _id array ]
  6. }

如何查询以获取用户喜欢的视频?像下面这样?

  1. [
  2. {
  3. _id: 1
  4. mp4_url,
  5. liked_count
  6. },
  7. {
  8. _id: 2
  9. mp4_url,
  10. liked_count
  11. },
  12. ...
  13. ]

非常感谢。

bmvo0sr5

bmvo0sr51#

你需要使用 $lookup 加入集合和 $size 获取数组大小的步骤

  1. db.video.aggregate([
  2. {
  3. "$lookup": {
  4. "from": "user",
  5. "localField": "_id",
  6. "foreignField": "liked_videos",
  7. "as": "join_video"
  8. }
  9. },
  10. {
  11. "$project": {
  12. liked_count: {
  13. $size: "$join_video"
  14. }
  15. }
  16. }
  17. ])

工作旺哥Playground

展开查看全部
sqougxex

sqougxex2#

这样试试

  1. db={
  2. "video": [
  3. {
  4. "_id": 1,
  5. "mp4_url": "url1",
  6. "liked_count": 2,
  7. "quantity": 2
  8. },
  9. {
  10. "_id": 2,
  11. "mp4_url": "url2",
  12. "liked_count": 3,
  13. "quantity": 1
  14. },
  15. {
  16. "_id": 3,
  17. "mp4_url": "url2",
  18. "liked_count": 3,
  19. "quantity": 4
  20. }
  21. ],
  22. "User": [
  23. {
  24. "_id": 1,
  25. "username": "almonds",
  26. "password": "pwd",
  27. "Likedvideos": [
  28. "aaa",
  29. "ffff"
  30. ]
  31. },
  32. {
  33. "_id": 2,
  34. "username": "almonds",
  35. "password": "pwd",
  36. "Likedvideos": [
  37. "qqq",
  38. "bbbb"
  39. ]
  40. },
  41. {
  42. "_id": 3,
  43. "username": "almonds",
  44. "password": "pwd",
  45. "Likedvideos": [
  46. "ccc",
  47. "ffff"
  48. ]
  49. },
  50. {
  51. "_id": 4,
  52. "username": "almonds",
  53. "password": "pwd",
  54. "Likedvideos": [
  55. "bbbb",
  56. "ffff"
  57. ]
  58. },
  59. {
  60. "_id": 5,
  61. "username": "almonds",
  62. "password": "pwd",
  63. "Likedvideos": [
  64. "qqq",
  65. "ffff"
  66. ]
  67. },
  68. {
  69. "_id": 6
  70. }
  71. ]
  72. }

查询:

  1. db.video.aggregate([
  2. {
  3. $match: {
  4. _id: 1
  5. }
  6. },
  7. {
  8. "$lookup": {
  9. "from": "User",
  10. "localField": "_id",
  11. "foreignField": "_id",
  12. "as": "data"
  13. },
  14. },
  15. {
  16. $unwind: "$data"
  17. },
  18. {
  19. $replaceRoot: {
  20. newRoot: {
  21. $mergeObjects: [
  22. "$data",
  23. "$$ROOT"
  24. ]
  25. }
  26. }
  27. },
  28. {
  29. $project: {
  30. data: 0
  31. }
  32. }
  33. ])

输出:

  1. [
  2. {
  3. "Likedvideos": [
  4. "aaa",
  5. "ffff"
  6. ],
  7. "_id": 1,
  8. "liked_count": 2,
  9. "mp4_url": "url1",
  10. "password": "pwd",
  11. "quantity": 2,
  12. "username": "almonds"
  13. }
  14. ]

mongoplayground

展开查看全部

相关问题