MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как получавате достъп до конкретен елемент от масив в агрегирането на проекции на MongoDB?

Функцията, която ще ви помогне да постигнете това, все още не е налична. Ще има обаче нов оператор за агрегиране, който дава елемент на масив за даден индекс. Новият израз се нарича $arrayElemAt

Използвайте новия оператор за агрегиране, който е наличен за MongoDB версии 3.2.X и по-голям, това връща елемент от масив за даден индекс. Новият израз се нарича $arrayElemAt . Той приема два аргумента, масив и индекс и връща елемента на дадения индекс в масива. Отрицателните индекси се приемат като индекси от задната част на масива. Ако индексът е извън границите, той връща липсващата стойност, което означава, че полето няма да съществува в изхода:

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

Като заобиколно решение за момента (приемайки, че масивът от координати винаги ще има два елемента във всеки даден момент), можете да опитате следния конвейер за агрегиране, който ще се възползва от $first и $last групи акумулаторни оператори, за да получите елементите след $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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Клас „MongoClient“ не е намерен

  2. Колекция за копиране на Mongo и потребителски разрешения

  3. Изпълняване на MongoDB на DigitalOcean

  4. Има ли начин да принудите mongodb да съхранява определен индекс в ram?

  5. Laravel 4:Класът „MongoClient“ не е намерен