добавление значения поля из агрегации в массив - PullRequest
0 голосов
/ 03 октября 2018

Коллекция навыков:

    "skillID" : "10cff2ae-76e7-455a-b1f2-07c6104d254b",
    "skillname" : "java",
    "languageID" : "84c2613c-81c3-4477-ab38-433aaef74373",
    "languagename" : "English",
    "noofendorsement" : 0

    "skillID" : "10cff2ae-76e7-455a-b1f2-07c6104d254b",
    "skillname" : "जावा",
    "languageID" : "hindi",
    "languagename" : "hindi",
    "noofendorsement" : 0



"skillID" : "39bca1af-bea4-4a24-9f50-33992f8f8a6e",
    "skillname" : "python",
    "languageID" : "84c2613c-81c3-4477-ab38-433aaef74373",
    "languagename" : "English",
    "noofendorsement" : 0

"skillID" : "39bca1af-bea4-4a24-9f50-33992f8f8a6e",
    "skillname" : "अजगर",
    "languageID" : "hindi",
    "languagename" : "hindi",
    "noofendorsement" : 0

Коллекция работ:

    "_id" : ObjectId("5bace08ce4b022aa88870ab2"),
    "_class" : "com.citizenchat.model.Jobs",
    "userID" : "ff7f88d9-d0e5-4c10-a7b0-b9fd8b5e89eb",
    "jobID" : "4d0b02b9-c508-42cb-a2c1-417f6b3d422b",
    "jobProfile" : "Legislators",
    "lastDate" : "29-09-2018",
    "jobEndDateMilliSeconds" : NumberLong(1538245799999),
    "jobEndDate" : ISODate("2018-09-29T18:29:59.999Z"),
    "jobstatus" : "Expired",
    "jobType" : "Fulltime",
    "jobDescription" : "Job",
    "postingDate" : "27-09-2018 13:52:12.787",
    "user_Skilllist" : [ 
        "10cff2ae-76e7-455a-b1f2-07c6104d254b"
    ],
    "user_occupationname" : "Legislators",
    "user_occupationid" : "154bddd1-5224-47cf-b3d0-f7dfc3ae9c83",
    "jobPostDateTimeMilliseconds" : NumberLong(1538850599999),

Я использую следующий запрос агрегации.

db.Jobs.aggregate([
{"$match":{"jobID":"4d0b02b9-c508-42cb-a2c1-417f6b3d422b"}},
 {
    $lookup:
       {
          from: "Skill",
          let:{"user_Skilllist":"$user_Skilllist"},
           pipeline:[
              {"$match":
                 {"$or":[
                    {"languageID":"hindi","$expr":{"$in":["$skillID","$$user_Skilllist"]}},
                    {"languageID":"84c2613c-81c3-4477-ab38-433aaef74373","$expr":{"$in":["$skillID","$$user_Skilllist"]}}
                         ]

                    }

               },

          ],
          as: "skills"
      }
 },



])

Я получаю следующий результат.Но мое требование: 1) я передам languageID, чтобы получить навыки только на этом языке. Если мой предпочитаемый язык недоступен для этого навыка, необходимо получить языковой стандарт по умолчанию на английском языке. Но когда я передаю тот же навык с идентификатором языкакоторый присутствует на разных языках, которые я получаю.

2) После получения всех умений из агрегации. Передайте все имена умений в массив.

 {
    "_id" : ObjectId("5bace08ce4b022aa88870ab2"),
    "_class" : "com.citizenchat.model.Jobs",
    "userID" : "ff7f88d9-d0e5-4c10-a7b0-b9fd8b5e89eb",
    "jobID" : "4d0b02b9-c508-42cb-a2c1-417f6b3d422b",
    "jobProfile" : "Legislators",
    "lastDate" : "29-09-2018",
    "jobEndDateMilliSeconds" : NumberLong(1538245799999),
    "jobEndDate" : ISODate("2018-09-29T18:29:59.999Z"),
    "jobstatus" : "Expired",
    "jobType" : "Fulltime",
    "jobDescription" : "Job",
    "postingDate" : "27-09-2018 13:52:12.787",
    "user_Skilllist" : [ 
        "10cff2ae-76e7-455a-b1f2-07c6104d254b"
    ],
    "user_occupationname" : "Legislators",
    "user_occupationid" : "154bddd1-5224-47cf-b3d0-f7dfc3ae9c83",
    "jobPostDateTimeMilliseconds" : NumberLong(1538850599999),

    "skills" : [ 
        {
            "_id" : ObjectId("5ba0fbc7e4b03e2c8b8f6519"),
            "_class" : "com.citizenchat.model.Skill",
            "skillID" : "10cff2ae-76e7-455a-b1f2-07c6104d254b",
            "skillname" : "java",
            "languageID" : "84c2613c-81c3-4477-ab38-433aaef74373",
            "languagename" : "English",
            "noofendorsement" : 0
        }, 
        {
            "_id" : ObjectId("5bb47d07fc7ab61be62de768"),
            "skillID" : "10cff2ae-76e7-455a-b1f2-07c6104d254b",
            "skillname" : "जावा",
            "languageID" : "hindi",
            "languagename" : "hindi",
            "noofendorsement" : 0
        }
    ]
}

Я хочу, чтобы вывод был таким:

"userID" : "ff7f88d9-d0e5-4c10-a7b0-b9fd8b5e89eb",
    "jobID" : "4d0b02b9-c508-42cb-a2c1-417f6b3d422b",
    "jobProfile" : "Legislators",
    "lastDate" : "29-09-2018",
    "jobEndDateMilliSeconds" : NumberLong(1538245799999),
    "jobEndDate" : ISODate("2018-09-29T18:29:59.999Z"),
    "jobstatus" : "Expired",
    "jobType" : "Fulltime",
    "jobDescription" : "Job",
    "postingDate" : "27-09-2018 13:52:12.787",
    "user_Skilllist" : [ 
        "10cff2ae-76e7-455a-b1f2-07c6104d254b"
    ],
    "user_occupationname" : "Legislators",
    "user_occupationid" : "154bddd1-5224-47cf-b3d0-f7dfc3ae9c83",
    "jobPostDateTimeMilliseconds" : NumberLong(1538850599999),

    "skills" : [ 
        "जावा",
         "अजगर"
    ]
}

1 Ответ

0 голосов
/ 04 октября 2018

Вот подход, использующий $ facet :

db.Jobs.aggregate([{
    $match: { "jobID": "4d0b02b9-c508-42cb-a2c1-417f6b3d422b" }
}, {
    $lookup: {
        "from": "Skill",
        "let": { "user_Skilllist": "$user_Skilllist" },
        "pipeline": [{
                $match: { "$expr": { "$in": ["$skillID", "$$user_Skilllist"] } }
            }, {
                $facet: {
                    "perfectMatch": [ { $match: { "languageID": "hindi" } } ],
                    "fallBack": [ { $match: { "languageID": "84c2613c-81c3-4477-ab38-433aaef74373" } } ],
                }
            }, {
                $project: {
                    "skillname": { $arrayElemAt: [ { $concatArrays: [ "$perfectMatch.skillname", "$fallBack.skillname" ] }, 0 ] } // take the first proper value
                }
            }
        ],
        "as": "skills"
    }
}, {
    $addFields: { "skills": "$skills.skillname" }
}])

А вот тот, который использует $ switch - идея состоит в том, чтобы отобразить предпочтительное значение в 1откат к 2 и все остальные к 3, чтобы мы могли отсортировать:

db.Jobs.aggregate([{
    $match: { "jobID": "4d0b02b9-c508-42cb-a2c1-417f6b3d422b" }
}, {
    $lookup: {
        "from": "Skill",
        "let": { "user_Skilllist": "$user_Skilllist" },
        "pipeline": [{
                $match: { "$expr": { "$in": ["$skillID", "$$user_Skilllist"] } }
            }, {
                $addFields: {
                    "preferredOrder": {
                        $switch: {
                           "branches": [
                              { "case": { $eq: [ "$languageID", "hindi" ] }, "then": 1 },
                              { "case": { $eq: [ "$languageID", "84c2613c-81c3-4477-ab38-433aaef74373" ] }, "then": 2 }
                           ],
                           "default": 3
                        }
                    }
                }
            }, {
                $sort: { "preferredOrder": 1 }
            }
        ],
        "as": "skills"
    }
}, {
    $addFields: {
        "skills": [{
            $arrayElemAt: [ "$skills.skillname", 0 ]
        }]
    }
}])

ОБНОВЛЕНИЕ на основе вашего комментария:

На основе $switchверсия работает с несколькими записями в массиве user_Skilllist следующим образом:

db.Jobs.aggregate([{
    $match: { "jobID": "4d0b02b9-c508-42cb-a2c1-417f6b3d422b" }
}, {
    $lookup: {
        "from": "Skill",
        "let": { "user_Skilllist": "$user_Skilllist" },
        "pipeline": [{
                $match: { "$expr": { "$in": ["$skillID", "$$user_Skilllist"] } }
            }, {
                $addFields: {
                    "preferredOrder": {
                        $switch: {
                           "branches": [
                              { "case": { $eq: [ "$languageID", "hindi" ] }, "then": 1 },
                              { "case": { $eq: [ "$languageID", "84c2613c-81c3-4477-ab38-433aaef74373" ] }, "then": 2 }
                           ],
                           "default": 3
                        }
                    }
                }
            }, {
                $sort: { "preferredOrder": 1 }
            }, {
                $group: {
                    _id: "$skillID",
                    languages: { $first: "$skillname" }
                }
            }
        ],
        "as": "skills"
    }
}, {
    $addFields: {
        "skills": "$skills.languages"
    }
}])
...