【问题标题】:How to get linked data from 2 collections with aggregation mongoDB如何使用聚合 mongoDB 从 2 个集合中获取链接数据
【发布时间】:2021-07-26 17:20:15
【问题描述】:

我是 MongoDB 新手,我有 2 个集合:User 和 Video,结构如下。当用户点赞视频时,视频的_id 将被添加到用户收藏的liked_videos。 liked_videos 是一个 _id 数组

视频收藏

{
    _id
    mp4_url,
    liked_count
}

用户收藏

{
    _id,
    username,
    password,
    liked_videos: [ // videos _id array ]
}

如何查询得到用户点赞的视频?像下面这样?

[
    {
    _id: 1
    mp4_url,
    liked_count
    },
    {
    _id: 2
    mp4_url,
    liked_count
    },
    ...
]

谢谢

【问题讨论】:

    标签: node.js arrays mongodb mongoose


    【解决方案1】:

    您需要使用$lookup 加入集合并使用$size 获取数组大小

    db.video.aggregate([
      {
        "$lookup": {
          "from": "user",
          "localField": "_id",
          "foreignField": "liked_videos",
          "as": "join_video"
        }
      },
      {
        "$project": {
          liked_count: {
            $size: "$join_video"
          }
        }
      }
    ])
    

    工作Mongo playground

    【讨论】:

    • 谢谢,效果很好。但是如果我只想从 user1 获取 like_videos,如何更新上面的代码?
    • 我将发布用户_id,然后结果将显示他喜欢的视频数组。
    • 我玩弄了你的代码并找到了解决方案,再次感谢你。
    • @kien 好极了...抱歉回复晚了...有点忙
    【解决方案2】:

    试试这个方法

    db={
      "video": [
        {
          "_id": 1,
          "mp4_url": "url1",
          "liked_count": 2,
          "quantity": 2
        },
        {
          "_id": 2,
          "mp4_url": "url2",
          "liked_count": 3,
          "quantity": 1
        },
        {
          "_id": 3,
          "mp4_url": "url2",
          "liked_count": 3,
          "quantity": 4
        }
      ],
      "User": [
        {
          "_id": 1,
          "username": "almonds",
          "password": "pwd",
          "Likedvideos": [
            "aaa",
            "ffff"
          ]
        },
        {
          "_id": 2,
          "username": "almonds",
          "password": "pwd",
          "Likedvideos": [
            "qqq",
            "bbbb"
          ]
        },
        {
          "_id": 3,
          "username": "almonds",
          "password": "pwd",
          "Likedvideos": [
            "ccc",
            "ffff"
          ]
        },
        {
          "_id": 4,
          "username": "almonds",
          "password": "pwd",
          "Likedvideos": [
            "bbbb",
            "ffff"
          ]
        },
        {
          "_id": 5,
          "username": "almonds",
          "password": "pwd",
          "Likedvideos": [
            "qqq",
            "ffff"
          ]
        },
        {
          "_id": 6
        }
      ]
    }
    

    查询:

    db.video.aggregate([
      {
        $match: {
          _id: 1
        }
      },
      {
        "$lookup": {
          "from": "User",
          "localField": "_id",
          "foreignField": "_id",
          "as": "data"
        },
        
      },
      {
        $unwind: "$data"
      },
      {
        $replaceRoot: {
          newRoot: {
            $mergeObjects: [
              "$data",
              "$$ROOT"
            ]
          }
        }
      },
      {
        $project: {
          data: 0
        }
      }
    ])
    

    输出:

    [
      {
        "Likedvideos": [
          "aaa",
          "ffff"
        ],
        "_id": 1,
        "liked_count": 2,
        "mp4_url": "url1",
        "password": "pwd",
        "quantity": 2,
        "username": "almonds"
      }
    ]
    

    mongoplayground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 2017-10-10
      • 2017-02-12
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      相关资源
      最近更新 更多