我有GeoJSON点的文档,我想用坐标计算“square”。为了做到这一点,我用相同纬度/经度的模数和方形的维数减去纬度/经度。
我收到了一个错误:
"errmsg" : "$mod only supports numeric types, not Array and NumberDouble"
我不明白,因为我使用点符号来提取纬度和经度。为什么说这是一个阵列?
我使用相同的查询没有问题,但坐标存储在两个不同的属性中而不是在同一个数组中。
示例文件:
{
"_id" : ObjectId("560dcd15491a065d6ab1085c"),
"nodeLoc" :
{
"type" : "Point",
"coordinates" :
[
2.352221,
48.856612
]
}
}
聚合:
db.collection.aggregate(
[
{
$group:
{
_id:
{
latGroup: {$subtract: ["$nodeLoc.coordinates.1", {$mod: ["$nodeLoc.coordinates.1", 0.5]}]},
lonGroup: {$subtract: ["$nodeLoc.coordinates.0", {$mod: ["$nodeLoc.coordinates.0", 0.5]}]},
},
count: {$sum: 1}
}
}
]
)
我期待这样的结果:
latGroup : 2 lonGroup : 48,5 count : 1
...
提前致谢
答案 0 :(得分:1)
从MongoDB 3.2开始,您可以使用$arrayElemAt
运算符返回特定索引处的元素。
db.collection.aggregate([
{ "$group": {
"_id": {
"latGroup": {
"$subtract": [
{ "$arrayElemAt": [ "$nodeLoc.coordinates", 1 ] },
{ "$mod": [
{ "$arrayElemAt": [ "$nodeLoc.coordinates", 1 ] },
0.5
]}
]
},
"longGroup": {
"$subtract": [
{ "$arrayElemAt": [ "$nodeLoc.coordinates", 0 ] },
{ "$mod": [
{ "$arrayElemAt": [ "$nodeLoc.coordinates", 0 ] },
0.5
]}
]
}
},
"count": { "$sum": 1 }
}}
])
从MongoDB版本< = 3.0,您需要对"坐标"进行去标准化。数组然后_id"
由db.collection.aggregate([
{ "$unwind": "$nodeLoc.coordinates" },
{ "$group": {
"_id": "$_id",
"latGroup": { "$first": "$nodeLoc.coordinates" },
"longGroup": { "$last": "$nodeLoc.coordinates" }
}},
{ "$group": {
"_id": {
"latgroup": {
"$subtract": [
"$latGroup",
{ "$mod": [ "$latGroup", 0.5 ] }
]
},
"lonGroup": {
"$subtract": [
"$longGroup",
{ "$mod": [ "$longGroup", 0.5 ] }
]
}
},
"count": { "$sum": 1 }
}}
])
开始$group
并使用$first
和$last
累加器分别返回"坐标"中的第一个和最后一个值。阵列。从那里,您可以使用$mod
运算符轻松地重新组合文档。
{{1}}