目前还没有可用的功能实现此操作。但是,对于 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" }
}
}
];