我有一个类似于以下的工作集
"_id" : ObjectId("5b6abaaf9bcdb5d4ae6491d2"),
"jobID" : "1",
"userID":"5",
"jobstatus" : "Active",
"shortListedUsers" : [
"1",
"2"
],
"appliedUsers" : [
"1",
"2",
"3",
"4"
]
和如下所示的用户集合
{
"_id" : ObjectId("5b59610208253701e11d7a02"),
"userID" : "1",
"user_Name" : "prasanth"
}
{
"_id" : ObjectId("5b59611808253701e11d7a14"),
"userID" : "2",
"user_Name" : "harish"
}
{
"_id" : ObjectId("5b596e6b08253701e11d896c"),
"userID" : "3",
"user_Name" : "dinesh"
}
{
"_id" : ObjectId("5b596e6b08253701e11d8962"),
"userID" : "4",
"user_Name" : "ravi"
}
{
"_id" : ObjectId("5b596e6b08253701e11d896c"),
"userID" : "5",
"user_Name" : "kohli"
"friendlist":["1"]
}
我想要这样的输出
输出:
{
"_id" : ObjectId("5b59610208253701e11d7a02"),
"userID" : "1",
"user_Name" : "prasanth",
"status":"shortlisted",
"firendstatus":"friend"
}
{
"_id" : ObjectId("5b59611808253701e11d7a14"),
"userID" : "2",
"user_Name" : "harish",
"status":"shortlisted",
"firendstatus":"requestsent"
}
{
"_id" : ObjectId("5b596e6b08253701e11d896c"),
"userID" : "3",
"user_Name" : "dinesh"
"status":"not shortlisted"
"firendstatus":"request received"
}
{
"_id" : ObjectId("5b596e6b08253701e11d896c"),
"userID" : "4",
"user_Name" : "ravi"
"status":"not shortlisted"
"firendstatus":"not friend"
}
FriendRequest集合:
{
"_id" : ObjectId("5b596e6b08253701e11d896c"),
"formuserID" : "5",
"touserID" : "2"
}
{
"_id" : ObjectId("5b596e6b08253701e11d896c"),
"formuserID" : "3",
"touserID" : "5"
}
我将传递jobid和userid作为输入。我想要firendstatus以及status。 firendstatus字符串更新条件:
friend:在发布了作业的userID的好友列表数组中,在Job集合中将JobID应用于作业集合的AppliedUsers数组列表中时,然后在输出中将字符串更新为(firendstatus:friend)
请求:职位发布的用户向另一个用户发送好友请求后, (firendstatus:requestsent)在输出中。 EX:用户ID 5向用户ID 2发送好友请求。(FriendRequest集合) 收到请求::职位发布用户从另一个用户接收到朋友请求后,输出中(firendstatus:请求已接收)。
不是朋友:当入围用户不在职位发布用户的朋友列表中时 入围用户未向职位发布用户发送好友请求时 入围用户确实收到了职位发布用户的朋友请求
请帮助我。谢谢
我正在使用以下查询,但未提供请求者和接收到的请求。我不知道该怎么做。
db.Shortlistjobs.aggregate([
{"$match":{"jobID":"job1"}},
{"$lookup":{
"from":"User",
"let":{"appliedUsers":"$appliedUsers", "shortListedUser":"$shortListedUser"},
"pipeline":[
{"$match":{"$expr":{"$in":["$userID","$$appliedUsers"]}}},
{"$addFields":{
"status":{"$cond":[{"$in":["$userID","$$shortListedUser"]},"shortlisted","not shortlisted"]}
}},
{"$addFields":{
"friend_status":{"$cond":[{"$in":["$userID",["1","2","3","4"]]},"friend","not friend"]}
}},
],
"as":"users"
}},
{"$unwind":"$users"},
{"$replaceRoot":{"newRoot":"$users"}}
])
答案 0 :(得分:1)
您可以在3.6中使用以下管道。
$lookup
具有管道,可将作业集合加入应用用户的用户集合。
$addFields
和$in
,将入围用户与用户集中的每个用户ID进行比较,并向用户文档中添加新字段。
$unwind
和$replaceRoot
将所有用户提升到最高级别。
db.Job.aggregate([
{"$match":{"jobID":"1"}},
{"$lookup":{
"from":"User",
"let":{"appliedUsers":"$appliedUsers", "shortListedUsers":"$shortListedUsers"},
"pipeline":[
{"$match":{"$expr":{"$in":["$userID","$$appliedUsers"]}}},
{"$addFields":{
"status":{"$cond":[{"$in":["$userID","$$shortListedUsers"]},"shortlisted","not shortlisted"]}
}}
],
"as":"users"
}},
{"$unwind":"$users"},
{"$replaceRoot":{"newRoot":"$users"}}
])
答案 1 :(得分:0)
对于非SQL数据库,建议不要使用运行联接查询,并且需要联接期望的输出。因此最好使用如下所示的嵌入式文档:
{
"_id" : ObjectId("5b6abaaf9bcdb5d4ae6491d2"),
"jobID" : "1",
"jobstatus" : "Active",
"shortListedUsers" : [
{
"userID" : "3",
"user_Name" : "dinesh"
},{
"userID" : "2",
"user_Name" : "Sumit"
}
],
"appliedUsers" : [
"1",
"2",
"3"
]
}
以上方法将使您的搜索更加简单和快捷。
答案 2 :(得分:0)
请尝试在下面的查询中对其进行正确测试并正常工作
db.job.aggregate(
// Pipeline
[
// Stage 1
{
$match:{
"jobID" : "1"
}
},
{
$unwind: {
path : "$appliedUsers",
includeArrayIndex : "arrayIndex", // optional
preserveNullAndEmptyArrays : false // optional
}
},
// Stage 2
{
$project: {
"shortListedUsers":1,
"appliedUsers":1,
"ifMatched" : {
$in: [ "$appliedUsers", "$shortListedUsers" ]
}
}
},
// Stage 3
{
$lookup: {
"from" : "users",
"localField" : "appliedUsers",
"foreignField" : "userID",
"as" : "allData"
}
},
// Stage 4
{
$project: {
"_id":1,
"userID":{ $arrayElemAt: [ "$allData.userID", 0 ] },
user_Name: { $arrayElemAt: [ "$allData.user_Name", 0 ] },
status:{ $cond: { if: { $eq: [ "$ifMatched", true ] }, then:
"shortlisted", else: "not shortlisted" }}
}
},
],
);