I am dealing with documents that contain arrays of nested objects. Some fields have been omitted for simplicity.
Here is an example of how the documents are structured (2 documents):
{
title: 'abc',
parts: [
{
part: "verse",
progressions: [
{
progression: "62a4a87da7fdbdabf787e47f",
key: "Ab",
_id: "62b5aaa0c9e9fe8a7d7240d3"
},
{
progression: "62adf477ed11cbbe156d5769",
key: "C",
_id: "62b5aaa0c9e9fe8a7d7240d3"
}
],
_id: "62b5aaa0c9e9fe8a7d7240d2"
},
{
part: "chorus",
progressions: [
{
progression: "62a4a51b4693c43dce9be09c",
key: "E",
_id: "62b5aaa0c9e9fe8a7d7240d9"
}
],
_id: "62b5aaa0c9e9fe8a7d7240d8"
}
]
}
{
title: 'def',
parts: [
{
part: "verse",
progressions: [
{
progression: "33a4a87da7fopvvbf787erwe",
key: "E",
_id: "62b5aaa0c9e9fe8a7d7240d3"
},
{
progression: "98opf477ewfscbbe156d5442",
key: "Bb",
_id: "62b5aaa0c9e9fe8a7d7240d3"
}
],
_id: "12r3aaa0c4r5me8a7d72oi8u"
},
{
part: "bridge",
progressions: [
{
progression: "62a4a51b4693c43dce9be09c",
key: "C#",
_id: "62b5aaa0c9e9fe8a7d7240d9"
}
],
_id: "62b5aaa0rwfvse8a7d7240d8"
}
]
}
When a client sends a request, they provide an array of objects as parameters:
[
{ part: 'verse', progressions: ['62a4a87da7fdbdabf787e47f', '62a4a51b4693c43dce9be09c'] },
{ part: 'chorus', progressions: ['62adf477ed11cbbe156d5769'] }
]
I need to use MongoDB aggregation to retrieve documents that match at least one object in the input array above. For example, documents should have an object in the parts array with "verse" as the part and one of the specified progressions ids in the progressions property. Or documents should have an object in the parts array with "chorus" as the part and a specific progression id. In this case, the first document ('abc') is a match, but there may be more matches in real-world scenarios.
I attempted to create an aggregation pipeline using Mongoose's 'aggregate' method, but it did not work as expected due to my complex approach. I believe I used $elemMatch incorrectly. Any help to improve my aggregation pipeline would be greatly appreciated.