代码之家  ›  专栏  ›  技术社区  ›  Anurag Sharma

获取mongo中arrayfield中每个子文档的字段的默认值

  •  1
  • Anurag Sharma  · 技术社区  · 7 年前

    我有这样的文件-

    {
        "Details": "WorkProfile" : [
                            {
                                    "Company" : "UPS",
                                    "JobTitle" : "Preload Package Handler",
                                    "JobSkills" : {
                                            "CommonSkills" : [
                                                    ObjectId("5ad5ab860b94c96c738e911e")
                                            ],
                                            "OtherSkills" : [
                                                    ObjectId("5ad5ab860b94c96c738e9208")
                                            ]
                                    }
                            },
                            {
                                    "Company" : "L&L Tent and Party",
                                    "JobTitle" : "Delivery Driver/ Tent Installation",
                                    "JobSkills" : {
                                            "CommonSkills" : [
                                                    ObjectId("5ad5ab860b94c96c738e9227")
                                            ],
                                            "OtherSkills" : [ ]
                                    }
                            },
                            {
                                    "Company" : "All Pro Movers",
                                    "JobTitle" : "Mover"
                            },
                            {
                                    "Company" : "Carolina Farmin",
                                    "JobTitle" : "Head of Cullinary"
                            }
                    ],
    
    }
    

    我要去拿 OtherSkills 对于中的每个子文档 WorkProfile

    db.Collection.aggregate([{$match: {"DocId": "669f4a8f-13cd-4780-8115-e3f29b0d9b4f"}}, {$project: {"JobSkills": "$Details.WorkProfile.JobSkills.OtherSkills"}}]).pretty()
    {
            "_id" : ObjectId("5ad5ab89af2808b739ba6aac"),
            "JobSkills" : [
                    [
                            ObjectId("5ad5ab860b94c96c738e9208")
                    ],
                    [ ]
            ]
    }
    

    现在我想为字段设置一个默认值,如果该字段在子文档中不存在。为此我试着用 $ifNull 像这样的命令

     db.ResumeParsedData.aggregate([{$match: {"DocId": "669f4a8f-13cd-4780-8115-e3f29b0d9b4f"}}, {$project: {"JobSkills": {$ifNull: ["$ResumeDetails.WorkProfile.JobSkills.OtherSkills", "null"]}}}]).pretty()
    {
            "_id" : ObjectId("5ad5ab89af2808b739ba6aac"),
            "JobSkills" : [
                    [
                            ObjectId("5ad5ab860b94c96c738e9208")
                    ],
                    [ ]
            ]
    }
    

    我期待上述文件的输出-

    {
        "_id" : ObjectId("5ad5ab89af2808b739ba6aac"),
        "JobSkills" : [
                [
                        ObjectId("5ad5ab860b94c96c738e9208")
                ],
                [ ],
                "null",
                "null"
        ]
    

    }

    1 回复  |  直到 7 年前
        1
  •  1
  •   mickl    7 年前

    你需要 $map 使用 $ifNull

    db.col.aggregate([
        {
            $project: {
                "JobSkills": {
                    $map: {
                        input: "$Details.WorkProfile",
                        as: "p",
                        in: { $ifNull: [ "$$p.JobSkills.OtherSkills", "null" ] }
                    }
                }
            }
        }
    ]).pretty()
    

    输出:

    {
        "_id" : ...,
        "JobSkills" : [
                [
                        ObjectId("5ad5ab860b94c96c738e9208")
                ],
                [ ],
                "null",
                "null"
        ]
    }