sql >> Database >  >> NoSQL >> MongoDB

Hoe krijg je toegang tot een specifiek array-item in MongoDB-projectie-aggregatie?

De functie waarmee u dit kunt bereiken, is nog niet beschikbaar. Er zal echter een nieuwe aggregatie-operator zijn die een array-element voor een bepaalde index geeft. De nieuwe expressie heet $arrayElemAt

Gebruik de nieuwe aggregatie-operator die beschikbaar is voor MongoDB-versies 3.2.X en groter, dit retourneert een array-element voor een bepaalde index. De nieuwe uitdrukking heet $arrayElemAt . Het heeft twee argumenten nodig, een array en een index, en retourneert het element met de gegeven index in de array. Negatieve indices worden geaccepteerd als indexen vanaf de achterkant van de array. Als de index buiten de grenzen valt, wordt de ontbrekende waarde geretourneerd, wat betekent dat het veld niet zal bestaan ​​in de uitvoer:

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

Als tijdelijke oplossing (ervan uitgaande dat de coördinatenarray altijd twee elementen op een bepaald moment zal hebben), kunt u de volgende aggregatiepijplijn proberen die gebruik maakt van de $first en $last groep accumulator operators om de elementen te krijgen na een $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. Een genummerde lijst maken voor Meteor-gegevens

  2. Mongoose en meerdere databases in een enkel node.js-project

  3. ObjectId doorgeven van MongoDB in MVC.net

  4. Redis - enige manier om een ​​gebeurtenis te activeren wanneer er niet langer actief naar een waarde wordt geschreven?