Mongodb 在另一个查询的结果中使用$GEOIN
尝试使用Mongo DB的地理空间查询我的文档如下: 地点文件:Mongodb 在另一个查询的结果中使用$GEOIN,mongodb,mongodb-query,geospatial,Mongodb,Mongodb Query,Geospatial,尝试使用Mongo DB的地理空间查询我的文档如下: 地点文件: { "_id": ObjectId("57062a9253e564e0d522f001"), "geofences": [ { "geofenceId": "geoFence1", "loc": { "type": "Polygon", "coordinates": [
{
"_id": ObjectId("57062a9253e564e0d522f001"),
"geofences": [
{
"geofenceId": "geoFence1",
"loc": {
"type": "Polygon",
"coordinates": [
[
[
-11900093200000002,
33.53589500000004
],
[
-118.96275899999999,
33.48520500000012
],
[
-118.98051199999996,
33.42859300000009
],
[
-119.05307099999987,
33.411024
],
[
-119.094128,
33.426871999999946
],
[
-119.10887899999999,
33.451151000000095
],
[
-119.10721499999987,
33.50002300000011
],
[
-119.11894899999999,
33.500022
],
[
-119.10871799999988,
33.519264000000135
],
[
-119.07014300000003,
33.536415999999974
],
[
-119.00093200000002,
33.53589500000004
]
]
]
}
}
]
}
资产文件:
{
"_id": ObjectId("536b150c30048054e3480789"),
"loc": {
"type": "Point",
"coordinates": [
-120.954436,
37.625814000000005
]
},
"name": "kingize",
"type": "priceless",
"code": "pwd"
}
它们被正确插入,但当我尝试执行以下操作时:
var myloc = db.locations.find().next()
db.assetlocation.find( { loc : { $geoWithin : { $geometry : myloc.geofences } } })
我得到:
error: {
"waitedMS" : NumberLong(0),
"ok" : 0,
"errmsg" : "Point must only contain numeric elements",
"code" : 2
}
我认为这个错误只会出现在insert语句上,但令我惊讶的是,它们工作得非常完美。问题在于
“locations”
集合中包含的文档中的“geofenses”
属性实际上是一个“数组”。因此,这种直接形式的数据不适合用于
为了向提供“loc”
数据,您需要实际迭代“geofenses”
的每个数组元素,并从每个元素传入数据:
var结果=[];
var cursor=db.locations.find();
//迭代光标
while(cursor.hasNext()){
var doc=cursor.next();
//迭代每个geofences元素
文件geofines.forEach(功能(围栏){
//对结果数组的查询
var assets=db.assetlocation.find({
“loc”:{
“$geoWitin”:{
“$geometry”:fence.loc
}
}
}).toArray();
//附加到总结果中
结果=结果。concat(资产);
});
}
//打印所有结果
printjson(结果);
因此,您需要“首先”获取每个结果文档中的每个数组元素,然后您可以使用包含的数据提供给查询
“assetlocation”
集合并收集获得的结果。问题在于“geofences”
属性包含在位置中的文档中
集合实际上是一个“数组”。因此,这种直接形式的数据不适合用于
为了向提供“loc”
数据,您需要实际迭代“geofenses”
的每个数组元素,并从每个元素传入数据:
var结果=[];
var cursor=db.locations.find();
//迭代光标
while(cursor.hasNext()){
var doc=cursor.next();
//迭代每个geofences元素
文件geofines.forEach(功能(围栏){
//对结果数组的查询
var assets=db.assetlocation.find({
“loc”:{
“$geoWitin”:{
“$geometry”:fence.loc
}
}
}).toArray();
//附加到总结果中
结果=结果。concat(资产);
});
}
//打印所有结果
printjson(结果);
因此,您需要“首先”获取每个结果文档中的每个数组元素,然后您可以使用包含的数据提供给查询
“assetlocation”
集合,并收集获得的结果。您向查询传递了错误的参数。不要传递geofenses
对象,而是传递geofenses[0].loc
字段,该字段包含实际坐标和几何体类型
由于geofenches
是一个数组,因此可以通过循环获得单个几何体
请尝试以下代码段,它应该获取具有选定条件的文档
var myloc = db.locations.find().next()
var coor = myloc.geofences[0].loc;
db.assets.find( { loc : { $geoWithin : { $geometry : corr } } })
您向查询传递了错误的参数。不要传递
geofenses
对象,而是传递geofenses[0].loc
字段,该字段包含实际坐标和几何体类型
由于geofenches
是一个数组,因此可以通过循环获得单个几何体
请尝试以下代码段,它应该获取具有选定条件的文档
var myloc = db.locations.find().next()
var coor = myloc.geofences[0].loc;
db.assets.find( { loc : { $geoWithin : { $geometry : corr } } })