I have the following documents:
{
"dates": [
1399518702000,
1399126333000,
1399209192000,
1399027545000
],
"dress_number": "4",
"name": "J. Evans",
"numbers": [
"5982",
"5983",
"5984",
"5985"
]
}
Is it possible unwind data from multiple arrays and get only paired elements from arrays:
{
"dates": "1399518702000",
"numbers": "5982"
},
{
"dates": "1399126333000",
"numbers": "5983"
},
{
"dates": "1399209192000",
"numbers": "5984"
},
{
"dates": "1399027545000",
"numbers": "5985"
}
To unwind, use $unwind. The $unwind deconstructs an array field from the input documents to output a document for each element.
The MongoDB $unwind stages operator is used to deconstructing an array field from the input documents to output a document for each element. Every output document is the input document with the value of the array field replaced by the element. Points to remember: If the value of a field is not an array, db.
The MongoDB $unwind operator is used to deconstruct an array field in a document and create separate output documents for each item in the array.
From version 3.2 you can do it with $unwind
on both of the arrays, $cmp
the indexes, and $match
only the equal indexes.
This solution will populate what you wrote in case you have only the example document. If you have more documents I don't know what you expect to get in the output, but it's solvable by grouping by _id of the document.
db.test.aggregate([
{
$unwind: {
path: '$dates',
includeArrayIndex: 'dates_index',
}
},
{
$unwind: {
path: '$numbers',
includeArrayIndex: 'numbers_index',
}
},
{
$project: {
dates: 1,
numbers: 1,
compare: {
$cmp: ['$dates_index', '$numbers_index']
}
}
},
{
$match: {
compare: 0
}
},
{
$project: {
_id: 0,
dates: 1,
numbers: 1
}
}
])
Starting in Mongo 3.4
, you can use $zip
to pair your array elements:
// { values: [23, 2, 14], items: ["aa", "bb", "cc"] }
db.collection.aggregate([
{ $project: { x: { $zip: { inputs: ["$values", "$items"] } } } },
// { x: [[23, "aa"], [2, "bb"], [14, "cc"]] }
{ $unwind: "$x" },
// { x: [23, "aa"] }
// { x: [2, "bb"] }
// { x: [14, "cc"] }
{ $project: { value: { $first: "$x" }, item: { $last: "$x" } } }
])
// { value: 23, item: "aa" }
// { value: 2, item: "bb" }
// { value: 14, item: "cc" }
Once your arrays have been $zip
ped, it's just a matter of $unwind
ing them before creating documents out of arrays ({ value: { $first: "$x" }, item: { $last: "$x" } }
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With