MongoDB展开嵌套在文档数组中的数组

21
在 MongoDB 中,我需要能够展开一个嵌套在主文档内的数组中的文档数组。
{
    "_id" : ObjectId("5808d700536d1a3d69f4cf51"),
    "last_name" : "Maity",
    "xiith_mark" : 58,
    "id" : "3539488",
    "first_name" : "Harshavardhan",
    "course_name" : "BE/B.Tech",
    "institute_name_string" : "Abhayapuri College, P.O. Abhayapuri",
    "profile_percentage" : 45,
    "xiith_mark_type" : "Percentage",
    "xth_mark_type" : "Percentage",
    "date_of_birth" : "14-April-1993",
    "xth_mark" : 30,
    "last_login" : 1470827224,
    "percentage" : 55,
    "job_details" : [
        {
            "status" : NumberLong(6),
            "applied_date" : NumberLong(1470831441),
            "job_id" : NumberLong(92928),
            "contact_viwed_status" : 0,
            "label_name" : [
                "shortlisted",
                "rejected"
            ],
            "questionnaire_status" : 0,
            "batch_id" : NumberLong(6),
            "call_letter" : NumberLong(812)
        }, 
        {
            "status" : NumberLong(6),
            "applied_date" : NumberLong(1470831441),
            "job_id" : NumberLong(92928),
            "contact_viwed_status" : 0,
            "label_name" : [
                "shortlisted",
                "rejected"
            ],
            "questionnaire_status" : 0,
            "batch_id" : NumberLong(6),
            "call_letter" : NumberLong(812)
        }
    ],
    "branch_name" : "Applied Electronics",
    "candidate_state_name" : "West Bengal",
    "candidate_city_name_string" : "Kolkata",
    "10" : 10,
    "12" : 12,
    "skills" : "",
    "gender" : "Male",
    "fw_id" : "FW15884830",
    "cgpa" : 0,
    "picture_path" : "",
    "hq_passout_year" : 2019
}

根据上述记录,我需要计算工作标签(job_details.label_name)的数量。

我尝试了以下查询:

db.response.aggregate(
    {"$match":type_match},
    {"$unwind": "$job_details" }, 
    {"$group": 
      {
        "_id":"$job_details.label_name",
        "count": {"$sum": 1 }
      }
    }
])

输出结果为:

{
   "count": 2,
   "_id": [
   "shortlisted",
   "rejected"
    ]
}

但是我希望输出结果是:

[
  { 
      "count": 1,  
      "_id": "shortlisted"  
  },  
  {  
      "count": 1,  
      "_id": "rejected"  
  }
]

我该如何获得这个输出?


1
你是在询问如何计算 "job_details.label_name" 数组中元素的数量吗?在客户端执行计数可能更容易。 - Adam Harrison
你在问题中发布的聚合查询语句在语法上是不正确的。缺少起始的"["大括号,但是存在结尾的大括号。 - inaitgaJ
我改进了你的问题的措辞和格式,使其更易读。同时,我还加入了聚合框架标签。 - Vince Bowdren
1个回答

14

unwind 阶段,字段应该是一个数组字段。如果不是数组字段,则将其视为仅包含 1 个元素的数组。

来自文档:

从版本 3.2 开始更改:$unwind 阶段不再对非数组操作数报错。如果操作数未解析为数组但不缺失、为 null 或空数组,则 $unwind 将操作数视为单个元素数组。


回答您的查询:

db.response.aggregate([
    {
        $project:
        {
            "job_details.label_name":1,
            _id:0
        }
    },
    {
        $unwind:"$job_details.label_name"
    },
    {
        $group:
        {
            _id:"$job_details.label_name",
            count:{$sum:1}
        }
    }
])

参考 Shell 输出


2
{ "result" : [ ], "ok" : 1 } - SuFi
抱歉,Nigil。那个查询是有效的,但那是我的错误。我的实际文档有一点变化。那个“job_details”不是单个文档,而是文档列表。例如:"job_details":[{             "status":NumberLong(6),             "label_name":[                 "shortlisted",                 "rejected"             ]         },] - SuFi
2
没问题,sugi。你可以在父数组上再添加一个取消阶段。 - inaitgaJ
3
使用Mongo 3.6版本时,这个方法无法正常工作,结果为空。 - Peter Huang
2
是的,也许大于3.6,我正在使用4.0,在其中使用点表示法嵌套数组无法正常工作,导致结果为空数组,必须进行两次$unwind,这很繁琐。如果有人有解决方案,请告诉我们!! - whoami - fakeFaceTrueSoul
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接