如何访问 MongoDB 投影聚合中的特定数组项?

How do you access a specific array item in MongoDB projection aggregation?

我正在尝试在 MongoDB 聚合函数中创建投影,请参阅以下内容:

[
    {$match : {"geo" : {$ne: null}}},
    {$project : {"id" : "$id_str", lat: "$geo.coordinates.0", lon: "$geo.coordinates.1"}}
]

然而,当我这样做时,它不会传递数组项,它只是将一个空数组投影到属性 lat 和 lon。

这里需要什么?我查看了文档但无法弄清楚,甚至尝试了 $unwind 和 $group 的排列但没有成功。

帮助您实现这一目标的功能尚不可用。但是,将会有一个新的聚合运算符,它为给定的索引提供一个数组元素。新表达式称为 $arrayElemAt

使用可用于 MongoDB 版本 3.2.X 及更高版本的新聚合运算符,此 returns 是给定索引的数组元素。新表达式称为 $arrayElemAt。它有两个参数,一个数组和一个索引,以及 returns 数组中给定索引处的元素。负索引被接受为数组后面的索引。如果索引超出范围,它 returns 缺失值,这意味着该字段将不存在于输出中:

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

作为目前的解决方法(假设坐标数组在任何给定时间总是有两个元素),您可以尝试以下聚合管道,它将利用 $first and $last group accumulator operators to get the elements after a $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.coordinates',0]}, lon: {$arrayElemAt : ['$geo.coordinates',1]}, } }

如果您想更详细地了解 arrayElemAt 聚合运算符,请单击下面给出的 link:-

https://docs.mongodb.com/manual/reference/operator/aggregation/arrayElemAt/

获取更多信息:-

"所有文档必须以相同的顺序存储位置数据。如果您使用纬度和经度作为坐标系,请始终先存储经度。MongoDB的二维球面索引运算符仅识别 [经度、纬度] 订购。