Функцията, която ще ви помогне да постигнете това, все още не е налична. Ще има обаче нов оператор за агрегиране, който дава елемент на масив за даден индекс. Новият израз се нарича $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" }
}
}
];