sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan får du adgang til et specifikt array-element i MongoDB-projektionsaggregering?

Den funktion, der hjælper dig med at opnå dette, er endnu ikke tilgængelig. Der vil dog være en ny aggregeringsoperator, der giver et array-element for et givet indeks. Det nye udtryk hedder $arrayElemAt

Brug den nye aggregeringsoperator, der er tilgængelig for MongoDB-versioner 3.2.X og større returnerer dette et array-element for et givet indeks. Det nye udtryk hedder $arrayElemAt . Det tager to argumenter, et array og et indeks og returnerer elementet ved det givne indeks i arrayet. Negative indekser accepteres som indekser fra bagsiden af ​​arrayet. Hvis indekset er uden for grænserne, returnerer det den manglende værdi, hvilket betyder, at feltet ikke eksisterer i outputtet:

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

Som en løsning indtil videre (forudsat at koordinat-arrayet altid vil have to elementer på et givet tidspunkt), kan du prøve følgende aggregeringspipeline, som vil drage fordel af $first og $last gruppe akkumulatoroperatorer for at få elementerne 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. JSON-sti overordnet objekt eller tilsvarende MongoDB-forespørgsel

  2. hvordan man indstiller mongod --dbpath

  3. mongodb groupby langsom selv efter tilføjelse af indeks

  4. Hvordan man håndterer bindestreger i GraphQL Schema definitioner