MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie greifen Sie auf ein bestimmtes Array-Element in der MongoDB-Projektionsaggregation zu?

Die Funktion, die Ihnen dabei helfen wird, ist noch nicht verfügbar. Es wird jedoch einen neuen Aggregationsoperator geben, der ein Array-Element für einen bestimmten Index liefert. Der neue Ausdruck heißt $arrayElemAt

Verwenden Sie den neuen Aggregationsoperator, der für die MongoDB-Versionen 3.2.X verfügbar ist und größer gibt dies ein Array-Element für einen gegebenen Index zurück. Der neue Ausdruck heißt $arrayElemAt . Es nimmt zwei Argumente, ein Array und einen Index, und gibt das Element am angegebenen Index im Array zurück. Negative Indizes werden als Indizes von der Rückseite des Arrays akzeptiert. Wenn der Index außerhalb der Grenzen liegt, gibt er den fehlenden Wert zurück, was bedeutet, dass das Feld nicht in der Ausgabe vorhanden ist:

var pipeline = [    
    { $match : {"geo" : {$ne: null}}},
    {
        $project: {
            _id: "$id_str", 
            lat: { $arrayElemAt: ['$geo.coordinates', 0] },
            lon: { $arrayElemAt: ['$geo.coordinates', 1] }
        }
    }
];

Als vorläufige Problemumgehung (unter der Annahme, dass das Koordinaten-Array immer zwei Elemente zu einem bestimmten Zeitpunkt enthält), könnten Sie die folgende Aggregationspipeline ausprobieren, die den $first und $last Gruppieren Sie Akkumulatoroperatoren, um die Elemente nach einem abzurufen $sort :

var pipeline = [
    {$match : {"geo" : {$ne: null}}},
    { "$unwind": "$geo.coordinates" },
    { "$sort": {"geo.coordinates": 1} } ,
    {
        "$group": {
            "_id": "$_id",
            "lat": { "$first": "$geo.coordinates" },
            "lon": { "$last": "$geo.coordinates" }
        }
    }
];