如何访问 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的二维球面索引运算符仅识别 [经度、纬度] 订购。
我正在尝试在 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的二维球面索引运算符仅识别 [经度、纬度] 订购。