web-dev-qa-db-fra.com

MongoDB déroule plusieurs tableaux

Dans mongodb, il existe des documents dans la structure suivante:

{
    "_id" : ObjectId("52d017d4b60fb046cdaf4851"),
    "dates" : [
        1399518702000,
        1399126333000,
        1399209192000,
        1399027545000
    ],
    "dress_number" : "4",
    "name" : "J. Evans",
    "numbers" : [
        "5982",
        "5983",
        "5984",
        "5985"
    ]
}

Est-il possible de dérouler les données de plusieurs tableaux et d'obtenir uniquement des éléments appariés à partir des tableaux:

{
    "dates": "1399518702000",
    "numbers": "5982"
},
{
    "dates": "1399126333000",
    "numbers": "5983"
},
{
    "dates": "1399209192000",
    "numbers": "5984"
},
{
    "dates": "1399027545000",
    "numbers": "5985"
}
10
corry

Depuis la version 3.2, vous pouvez le faire avec $unwind sur les deux tableaux, $cmp les index et $match uniquement les index égaux.

Cette solution remplira ce que vous avez écrit au cas où vous ne disposez que de l'exemple de document. Si vous avez plus de documents, je ne sais pas ce que vous attendez de la sortie, mais c'est résoluble en les groupant par _id du 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
        }
    }
])
13
TomG