将$ mod与数组元素一起使用时出错

时间:2016-06-03 19:52:59

标签: mongodb mongodb-query aggregation-framework

我有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
...

提前致谢

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}}