我有这样的工作集
{
"_id" : ObjectId("5b6aecd49bcdb5d4ae64ae5d"),
"jobID" : "1",
"jobStatus" : "active",
"jobEndsDate" : ISODate("2018-08-15T23:59:59.014Z")
}
{
"_id" : ObjectId("5b6aed179bcdb5d4ae64ae99"),
"jobID" : "2",
"jobStatus" : "active",
"jobEndsDate" : ISODate("2018-08-15T23:59:59.014Z")
}
{
"_id" : ObjectId("5b6aed2e9bcdb5d4ae64aeb8"),
"jobID" : "3",
"jobStatus" : "active",
"jobEndsDate" : ISODate("2018-08-15T23:59:59.014Z")
}
{
"_id" : ObjectId("5b6aed419bcdb5d4ae64aec0"),
"jobID" : "4",
"jobStatus" : "expired",
"jobEndsDate" : ISODate("2018-08-01T23:59:59.014Z")
}
和这样的用户集合
"_id" : ObjectId("5b63047d2eef2646f3ad5887"),
"userID" : "1",
"appliedJobIds":["1","2"]
我想要所有由userID:“ 1”应用的作业文档。对于已应用的作业,将一个字段添加为“ jobStatus”:“ applied”(不更新,通过使用$ addField),而其余字段未过期为jobStatus”:通过在查询中传递用户ID来“未应用”。
输出应如下所示:
输出:
"_id" : ObjectId("5b6979339bcdb5d4ae64498f"),
"jobID" : "1"
"jobStatus" : "active"
"jobEndsDate" : ISODate("2018-08-15T23:59:59.014Z"),
"jobApplyStatus":"applied"
"_id" : ObjectId("5b6979339bcdb5d4ae64498g"),
"jobID" : "2"
"jobStatus" : "active"
"jobEndsDate" : ISODate("2018-08-15T23:59:59.014Z"),
"jobApplyStatus":"applied"
"_id" : ObjectId("5b6979339bcdb5d4ae64498h"),
"jobID" : "3"
"jobStatus" : "active"
"jobEndsDate" : ISODate("2018-08-15T23:59:59.014Z"),
"jobApplyStatus":"not applied"
请帮助我,我不知道该怎么做。 谢谢
答案 0 :(得分:0)
您可以在3.6中使用以下管道。
$lookup
,带有用于将用户集合加入工作集合的管道。
$addFields
与$in
进行比较,以将应用的作业与作业集中的每个作业ID进行比较,并在现有作业中输出新字段。
$unwind
和$replaceRoot
将所有工作提升到最高水平。
db.User.aggregate([
{"$match":{"userID":"1"}},
{"$lookup":{
"from":"Job",
"let":{"appliedJobIds":"$appliedJobIds"},
"pipeline":[
{"$match":{"jobStatus":"active"}},
{"$addFields":{
"jobApplyStatus":{"$cond":[{"$in":["$jobID","$$appliedJobIds"]},"applied","not applied"]}
}}
],
"as":"jobs"
}},
{"$unwind":"$jobs"},
{"$replaceRoot":{"newRoot":"$jobs"}}
])