为 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
- 加盟条件:
- 来自
movie_id
。
movie_review
的review_date
不能早于($gte
)membership_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"
}
])
已更新:查找加入 movie_reviews
与 user_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
}
}
])
我有 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
- 加盟条件:
- 来自
movie_id
。 movie_review
的review_date
不能早于($gte
)membership_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"
}
])
已更新:查找加入 movie_reviews
与 user_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
}
}
])