我正试图在MongoDB聚合函数中创建一个投影,请参阅以下内容:
[
{$match : {"geo" : {$ne: null}}},
{$project : {"id" : "$id_str", lat: "$geo.coordinates.0", lon: "$geo.coordinates.1"}}
]
然而,当我这样做时,它不会传递数组项,它只是将一个空数组投影到属性lat和lon。
这里需要什么?我看过文档,但无法弄清楚,甚至尝试了$release和$group的排列,但没有成功。
$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" }
}
}
];
您可以在管道的项目阶段简单地使用它:-
{$项目:{_id:'$_id',lat:{$arrayElemAt:["$geo.cordinates",0]},lon:{$arrayElemAt:["$geo.cordinates",1]},}}
如果你想更详细地了解arrayElemAt聚合运算符,请单击下面的链接:-
https://docs.mongodb.com/manual/reference/operator/aggregation/arrayElemAt/
了解更多信息:-
"所有文档都必须以相同的顺序存储位置数据。如果使用纬度和经度作为坐标系,请始终首先存储经度。MongoDB的2d球形索引操作符只识别[经度,纬度]排序"