sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur får du åtkomst till ett specifikt arrayobjekt i MongoDB-projektionsaggregation?

Funktionen som hjälper dig att uppnå detta är inte tillgänglig ännu. Det kommer dock att finnas en ny aggregeringsoperator som ger ett arrayelement för ett givet index. Det nya uttrycket heter $arrayElemAt

Använd den nya aggregeringsoperatorn som är tillgänglig för MongoDB versioner 3.2.X och högre, detta returnerar ett matriselement för ett givet index. Det nya uttrycket heter $arrayElemAt . Det tar två argument, en array och ett index och returnerar elementet vid det givna indexet i arrayen. Negativa index accepteras som index från baksidan av arrayen. Om indexet är utanför gränserna returnerar det det saknade värdet, vilket betyder att fältet inte kommer att existera i utdata:

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

Som en lösning för tillfället (förutsatt att koordinatmatrisen alltid kommer att ha två element vid varje given tidpunkt), kan du prova följande aggregeringspipeline som kommer att dra fördel av $first och $last gruppera ackumulatoroperatorer för att hämta elementen efter en $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" }
        }
    }
];


  1. Sortera MongoDB GeoNear-resultat efter något annat än avstånd?

  2. Infoga Pandas tidsstämpel i Mongodb

  3. Tar summan av kolumn i MongoDB

  4. Gå med i två samlingar i MongoDB