mongodb通过检查具有ID的文档来添加字段

时间:2018-08-08 12:36:03

标签: mongodb mongodb-query aggregation-framework

我有这样的工作集

{
    "_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"

请帮助我,我不知道该怎么做。 谢谢

1 个答案:

答案 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"}}
])