如何在 mongoDB 中获取所有匹配的子数组对象
How do I get all matching sub array Objects in mongoDB
我关注JSON
[
{
"_id": "5c87e621257db42508007f3b",
"uuid": "8b03dba7-db96-40d0-8dd9-6a65efd6719a",
"user_answers": [
{
"profile_section_code": "MY_PROFILE",
"profile_question_code": "STANDARD_EDUCATION",
"selected_answer": [
"2"
]
},
{
"profile_section_code": "MY_PROFILE",
"profile_question_code": "ETHNICITY",
"selected_answer": [
"2"
]
},
{
"profile_section_code": "FAMILY",
"profile_question_code": "STANDARD_HHI_US",
"selected_answer": [
"11"
]
},
{
"profile_section_code": "FAMILY",
"profile_question_code": "STANDARD_HH_ASSETS",
"selected_answer": [
"5"
]
},
{
"profile_section_code": "AUTOMOTIVE",
"profile_question_code": "STANDARD_AUTO_DECISION_MAKER",
"selected_answer": [
"1"
]
}
],
"created_at": "2019-03-12T17:02:25.000Z"
}
]
完整的JSON可以在这里看到:Link
我想用 "profile_section_code" 获取所有 user_answers: "MY_PROFILE"
预期结果应该是这样的
{ "_id": "5c87e621257db42508007f3b", "uuid": "8b03dba7-db96-40d0-8dd9-6a65efd6719a", "user_answers": [ { "profile_section_code": "MY_PROFILE", "profile_question_code": "STANDARD_EDUCATION", "selected_answer": [ "2" ] }, { "profile_section_code": "MY_PROFILE", "profile_question_code": "ETHNICITY", "selected_answer": [ "2" ] }],"created_at": "2019-03-12T17:02:25.000Z" }
我在 Projection
中尝试了 $elemMatch,但它 return 是唯一的第一个匹配数组,我需要类似 $elemMatch 的东西,但应该 return 所有匹配数组。这是 Fiddle 同样的
我也尝试过使用 this Answer 但它没有用,因为它 return 只有第一个匹配的 subArray
- 有没有办法只使用投影来做到这一点(我想避免聚合,因为我必须在 PHP 中实现它)
- 如果以上不可能,那么我如何使用聚合来实现它?
请告诉我如何解决这个问题
使用 $filter
获得您预期的结果。此外,看起来聚合管道是过滤记录的唯一选项,或者需要在 PHP 代码级别完成。
[
{
'$addFields': {
'user_answers': {
'$filter': {
'input': '$user_answers',
'as': 'user_answer',
'cond': {
'$eq': [
'$$user_answer.profile_section_code', 'MY_PROFILE'
]
}
}
}
}
}
]
我关注JSON
[
{
"_id": "5c87e621257db42508007f3b",
"uuid": "8b03dba7-db96-40d0-8dd9-6a65efd6719a",
"user_answers": [
{
"profile_section_code": "MY_PROFILE",
"profile_question_code": "STANDARD_EDUCATION",
"selected_answer": [
"2"
]
},
{
"profile_section_code": "MY_PROFILE",
"profile_question_code": "ETHNICITY",
"selected_answer": [
"2"
]
},
{
"profile_section_code": "FAMILY",
"profile_question_code": "STANDARD_HHI_US",
"selected_answer": [
"11"
]
},
{
"profile_section_code": "FAMILY",
"profile_question_code": "STANDARD_HH_ASSETS",
"selected_answer": [
"5"
]
},
{
"profile_section_code": "AUTOMOTIVE",
"profile_question_code": "STANDARD_AUTO_DECISION_MAKER",
"selected_answer": [
"1"
]
}
],
"created_at": "2019-03-12T17:02:25.000Z"
}
]
完整的JSON可以在这里看到:Link
我想用 "profile_section_code" 获取所有 user_answers: "MY_PROFILE" 预期结果应该是这样的
{ "_id": "5c87e621257db42508007f3b", "uuid": "8b03dba7-db96-40d0-8dd9-6a65efd6719a", "user_answers": [ { "profile_section_code": "MY_PROFILE", "profile_question_code": "STANDARD_EDUCATION", "selected_answer": [ "2" ] }, { "profile_section_code": "MY_PROFILE", "profile_question_code": "ETHNICITY", "selected_answer": [ "2" ] }],"created_at": "2019-03-12T17:02:25.000Z" }
我在 Projection
中尝试了 $elemMatch,但它 return 是唯一的第一个匹配数组,我需要类似 $elemMatch 的东西,但应该 return 所有匹配数组。这是 Fiddle 同样的
我也尝试过使用 this Answer 但它没有用,因为它 return 只有第一个匹配的 subArray
- 有没有办法只使用投影来做到这一点(我想避免聚合,因为我必须在 PHP 中实现它)
- 如果以上不可能,那么我如何使用聚合来实现它?
请告诉我如何解决这个问题
使用 $filter
获得您预期的结果。此外,看起来聚合管道是过滤记录的唯一选项,或者需要在 PHP 代码级别完成。
[
{
'$addFields': {
'user_answers': {
'$filter': {
'input': '$user_answers',
'as': 'user_answer',
'cond': {
'$eq': [
'$$user_answer.profile_section_code', 'MY_PROFILE'
]
}
}
}
}
}
]