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



我正试图在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球形索引操作符只识别[经度,纬度]排序"

相关内容

  • 没有找到相关文章

最新更新