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

Ste*_*hen 6 mongodb aggregation-framework

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

[
    {$match : {"geo" : {$ne: null}}},
    {$project : {"id" : "$id_str", lat: "$geo.coordinates.0", lon: "$geo.coordinates.1"}}
]
Run Code Online (Sandbox Code Playgroud)

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

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

chr*_*dam 5

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

使用适用于 MongoDB3.2.X及更高版本的新聚合运算符,这将返回给定索引的数组元素。新表达式称为$arrayElemAt。它接受两个参数,一个数组和一个索引,并返回数组中给定索引处的元素。负索引被接受为数组后面的索引。如果索引越界,则返回缺失值,这意味着该字段将不存在于输出中:

var pipeline = [    
    { $match : {"geo" : {$ne: null}}},
    {
        $project: {
            _id: "$id_str", 
            lat: { $arrayElemAt: ['$geo.coordinates', 0] },
            lon: { $arrayElemAt: ['$geo.coordinates', 1] }
        }
    }
];
Run Code Online (Sandbox Code Playgroud)

作为现在的解决方法(假设坐标数组在任何给定时间总是有两个元素),您可以尝试以下聚合管道,它将利用$first$lastgroup 累加器运算符在 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" }
        }
    }
];
Run Code Online (Sandbox Code Playgroud)