为 Mongodb 中的每个项目添加单独的条件

Adding separate conditions for each item in Mongodb

我有 3 个 collection。

user_movie collection 保留用户与他添加到列表中的电影的关系。 membership_date 字段是用户订阅的时间。

通过我尝试的查询,用户看到了所有评论。

Collection结构

db={
  "user_movie": [
   {
    "_id" : 1,
    "movie_id" : 1,
    "user_id" : 1,
    "status" : true,
    "membership_date" : ISODate("2021-01-01")
    },
    {
    "_id" : 2,
    "movie_id" : 2,
    "user_id" : 1,
    "status" : true,
    "membership_date" :  ISODate("2021-01-01")
    },
    {
    "_id" : 3,
    "movie_id" : 3,
    "user_id" : 1,
    "status" : true,
    "membership_date" :  ISODate("2022-01-02")
    }
  ],
  "movie": [
    {
        "_id" : 1,
        "movie_name" : "fugiat nulla",
    },
    {
        "_id" : 2,
        "movie_name" : "sint occaecat",
    },
    {
        "_id" : 3,
        "movie_name" : "cupidatat non",
    }
  ],
  "movie_reviews": [
   {
        "_id" : 1,
        "movie_id" : 1,
        "review": "Lorem ipsum dolor"
        "review_date" : ISODate("2021-01-02"),
    },
    {
        "_id" : 2,
        "movie_id" : 2,
        "review": "Consectetur adipiscing elit"
        "review_date" : ISODate("2021-01-02"),
    },
    {
        "_id" : 3,
        "movie_id" : 3,
        "review": "Do eiusmod tempor"
        "review_date" : ISODate("2021-01-02"),
    },
    {
        "_id" : 4,
        "movie_id" : 3,
        "review": "Abore et dolore magna"
        "review_date" : ISODate("2022-01-01"),
    }
  ]
}

我尝试的查询给出了这个输出。

[
{
        "_id" : 1,
        "movie_id" : 1,
        "date" : ISODate("2021-01-02"),
    },
    {
        "_id" : 2,
        "movie_id" : 2,
        "date" : ISODate("2021-01-02"),
    },
    {
        "_id" : 3,
        "movie_id" : 3,
        "date" : ISODate("2021-01-02"),
    },
    {
        "_id" : 4,
        "movie_id" : 3,
        "date" : ISODate("2022-01-01"),
    }
]

但这不是我期望的输出。用户不应看到 ID 为 3,4 的电影评论。因为它是在 membership_date 日期之前写的,所以用户应该看不到这些评论。

如何获取id为1的用户的所有影评?

第 1 阶段:$lookup with pipeline

  • 加盟条件:
  1. 来自 movie_id
  2. movie_reviewreview_date不能早于($gtemembership_date(来自user_movie)。

第 2 阶段:$unwind

  • movie_reviews数组字段解构为多个文档。

第 3 阶段:$replaceWith

  • 修饰输出文档以显示 movie_review 文档。
db.user_movie.aggregate([
  {
    "$lookup": {
      "from": "movie_reviews",
      let: {
        movie_id: "$movie_id",
        membership_date: "$membership_date"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [
                    "$movie_id",
                    "$$movie_id"
                  ]
                },
                {
                  $gte: [
                    "$review_date",
                    "$$membership_date"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "movie_reviews"
    }
  },
  {
    $unwind: "$movie_reviews"
  },
  {
    "$replaceWith": "$movie_reviews"
  }
])

Sample Mongo Playground


已更新:查找加入 movie_reviewsuser_movie

既然你只是为了得到movie_reviews,我觉得从movie_reviews加入user_movie比从user_movie加入[=20=更好] 摆脱对 $unwind.

的使用
db.movie_reviews.aggregate([
  {
    "$lookup": {
      "from": "user_movie",
      let: {
        movie_id: "$movie_id",
        review_date: "$review_date"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [
                    "$movie_id",
                    "$$movie_id"
                  ]
                },
                {
                  $gte: [
                    "$$review_date",
                    "$membership_date"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "user_movie"
    }
  },
  {
    $match: {
      "user_movie": {
        $ne: []
      }
    }
  },
  {
    $project: {
      user_movie: 0
    }
  }
])

Sample Mongo Playground (Get movie_reviews)