MongoDB:对象的深度嵌套数组中的聚合查找
我有两个收藏: 音频MongoDB:对象的深度嵌套数组中的聚合查找,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有两个收藏: 音频 [ { "_id": "5f6b1a2e69eef14818ca03a7", "audioURL": "https://boyd.org", "state": "draft", } { "_id": "5f6b1e1c62
[
{
"_id": "5f6b1a2e69eef14818ca03a7",
"audioURL": "https://boyd.org",
"state": "draft",
}
{
"_id": "5f6b1e1c6297f34bc6f1fee3",
"name": "navigate",
"audioURL": "http://mariane.org",
"state": "draft",
},
{
"_id": "5f5b5423ba39f738d593b504",
"audioURL": "https://storage/test123mp31599820832928.mp3",
"state": "draft",
}
]
经验教训:
"lessons": [
{
"_id": "5f770e275cef7a611f3cf931",
"minigameDescriptions": [
{
"assessmentSections": [
{
"mark": "step_1",
"start": 1,
"end": 2,
"stepAudio": {
"backingTrackAudioId": "5f6b1a2e69eef14818ca03a7",
"previewTrackAudioId": "5f6b1a2e69eef14818ca03a7"
}
},
{
"mark": "step_2",
"start": 3,
"end": 6,
"stepAudio": {
"backingTrackAudioId": "5f6b1e1c6297f34bc6f1fee3",
"previewTrackAudioId": "5f6b1e1c6297f34bc6f1fee3"
}
},
{
"mark": "step_3",
"start": 7,
"end": 10,
"stepAudio": {
"backingTrackAudioId": "5f6b1a2e69eef14818ca03a7",
"previewTrackAudioId": "5f5b5423ba39f738d593b504"
}
}
],
"drumStyleName": "DrumStyleHalftimeShuffle",
"onboarding": false,
"showHints": false,
"minigameType": "StrummingTrainer",
}
],
"_updated_at": "2020-10-02T12:00:23.848Z",
}
]
}
现在我必须将其聚合起来,因为在每个mingameDescriptions.assessment部分
中都有属性stepAudio
,该属性具有previewTrackAudioId
和backingTrackAudioId
。这些对集合“audios”的引用,我需要将它们作为对象加入其中(audio主键是\u id
)。我尝试了以下管道(现在我只尝试查找previewTrackAudio
):
它“有点”起作用,我得到以下结果:
{
"lessons": [
{
"_id": "5f770e275cef7a611f3cf931",
"minigameDescriptions": [
{
"assessmentSections": {
"mark": "step_2",
"start": 3,
"end": 6,
"stepAudio": {
"backingTrackAudioId": "5f6b1e1c6297f34bc6f1fee3",
"previewTrackAudioId": "5f6b1e1c6297f34bc6f1fee3",
"previewTrackAudio": {
"_id": "5f6b1e1c6297f34bc6f1fee3",
"name": "navigate",
"audioURL": "http://mariane.org",
"state": "draft",
}
}
},
"drumStyleName": "DrumStyleHalftimeShuffle",
"onboarding": false,
"showHints": false,
"minigameType": "StrummingTrainer",
},
{
"assessmentSections": {
"mark": "step_3",
"start": 7,
"end": 10,
"stepAudio": {
"backingTrackAudioId": "5f6b1a2e69eef14818ca03a7",
"previewTrackAudioId": "5f5b5423ba39f738d593b504",
"previewTrackAudio": {
"_id": "5f5b5423ba39f738d593b504",
"audioURL": "https://storage/test123mp31599820832928.mp3",
"state": "draft",
}
}
},
"drumStyleName": "DrumStyleHalftimeShuffle",
"onboarding": false,
"showHints": false,
"minigameType": "StrummingTrainer",
},
{
"assessmentSections": {
"mark": "step_1",
"start": 1,
"end": 2,
"stepAudio": {
"backingTrackAudioId": "5f6b1a2e69eef14818ca03a7",
"previewTrackAudioId": "5f6b1a2e69eef14818ca03a7",
"previewTrackAudio": {
"_id": "5f6b1a2e69eef14818ca03a7",
"audioURL": "https://boyd.org",
"state": "draft",
}
}
},
"drumStyleName": "DrumStyleHalftimeShuffle",
"onboarding": false,
"showHints": false,
"minigameType": "StrummingTrainer",
}
],
"_updated_at": "2020-10-02T12:00:23.848Z",
}
]
}
但是现在没有了一个包含3个mingameDescriptions.assessmentSections
的数组,我有了一个包含三个对象的数组,它们包含assessmentSections
以及minigamescriptions
中的重复属性,这是错误的:/。我怎样才能解决这个问题
我想得到的是:
"lessons": [
{
"_id": "5f770e275cef7a611f3cf931",
"minigameDescriptions": [
{
"assessmentSections": [
{
"mark": "step_1",
"start": 1,
"end": 2,
"stepAudio": {
"backingTrackAudioId": "5f6b1a2e69eef14818ca03a7",
"previewTrackAudioId": "5f6b1a2e69eef14818ca03a7",
"previewTrackAudio": {
"_id": "5f6b1a2e69eef14818ca03a7",
"audioURL": "https://boyd.org",
"state": "draft",
}
}
},
{
"mark": "step_2",
"start": 3,
"end": 6,
"stepAudio": {
"backingTrackAudioId": "5f6b1e1c6297f34bc6f1fee3",
"previewTrackAudioId": "5f6b1e1c6297f34bc6f1fee3",
"previewTrackAudio": {
"_id": "5f5b5423ba39f738d593b504",
"audioURL": "https://storage/test123mp31599820832928.mp3",
"state": "draft",
}
}
},
{
"mark": "step_3",
"start": 7,
"end": 10,
"stepAudio": {
"backingTrackAudioId": "5f6b1a2e69eef14818ca03a7",
"previewTrackAudioId": "5f5b5423ba39f738d593b504",
"previewTrackAudio": {
"_id": "5f5b5423ba39f738d593b504",
"audioURL": "https://storage/test123mp31599820832928.mp3",
"state": "draft",
}
}
}
],
"drumStyleName": "DrumStyleHalftimeShuffle",
"onboarding": false,
"showHints": false,
"minigameType": "StrummingTrainer",
}
],
"_updated_at": "2020-10-02T12:00:23.848Z",
}
]
}
你所尝试的是正确的
[
{
$unwind: "$minigameDescriptions"
},
{
$unwind: "$minigameDescriptions.assessmentSections"
},
{
$lookup: {
from: "Audios",
let: {
audioId: "$minigameDescriptions.assessmentSections.stepAudio.previewTrackAudioId"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$_id",
"$$audioId"
]
}
}
}
],
as: "minigameDescriptions.assessmentSections.stepAudio.previewTrackAudio"
}
},
{
$group: {
_id: {
_id: "$_id",
/** assId: "$minigameDescriptions.assessmentSections.mark"*/
},
assessmentSections: {
$addToSet: "$minigameDescriptions.assessmentSections"
},
drumStyleName: {
$first: "$minigameDescriptions.drumStyleName"
},
minigameType: {
$first: "$minigameDescriptions.minigameType"
}
}
},
{
$group: {
_id: "$_id",
minigameDescriptions: {
$addToSet: {
assessmentSections: "$assessmentSections",
drumStyleName: "$drumStyleName",
minigameType: "$minigameType"
}
}
}
}
]
工作
注意:这里我们做了两次退绕,所以最好执行分组操作。请注意,我在第一组中对您的文档中未出现的
assessmentId
进行了注释。但是,如果您有任何东西来识别评估部分中的每个元素,则更好,这有助于避免变得复杂您需要发布这两个集合。不要在查看itRight时发布不必要的字段,这会让其他人感到不舒服。我已经发布了这两个集合并删除了不必要的字段。这几乎就是我需要的,谢谢!我编辑了这篇文章以添加我需要的回复,因为在您的解决方案中,我只得到评估部分
,而迷你游戏描述
中的其余属性缺失。你能帮我吗?我已经更新了我的答案,我已经做了几个领域,你可以按照同样的方式,这对你有帮助吗?我会检查,稍后让你知道!
[
{
$unwind: "$minigameDescriptions"
},
{
$unwind: "$minigameDescriptions.assessmentSections"
},
{
$lookup: {
from: "Audios",
let: {
audioId: "$minigameDescriptions.assessmentSections.stepAudio.previewTrackAudioId"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$_id",
"$$audioId"
]
}
}
}
],
as: "minigameDescriptions.assessmentSections.stepAudio.previewTrackAudio"
}
},
{
$group: {
_id: {
_id: "$_id",
/** assId: "$minigameDescriptions.assessmentSections.mark"*/
},
assessmentSections: {
$addToSet: "$minigameDescriptions.assessmentSections"
},
drumStyleName: {
$first: "$minigameDescriptions.drumStyleName"
},
minigameType: {
$first: "$minigameDescriptions.minigameType"
}
}
},
{
$group: {
_id: "$_id",
minigameDescriptions: {
$addToSet: {
assessmentSections: "$assessmentSections",
drumStyleName: "$drumStyleName",
minigameType: "$minigameType"
}
}
}
}
]