简体   繁体   中英

MongoDB unwind multiple arrays

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"
}

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" } } ).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM