mongodb检查另一个数组中的字符串数组并添加状态字段

时间:2018-08-14 11:02:35

标签: mongodb mongodb-query aggregation-framework

我有一个类似于以下的工作集

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

])

3 个答案:

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

);