mongodb地理空间索引是否支持包含多个lat长数组的对象?

时间:2014-04-30 01:20:01

标签: mongodb

是否可以使用像这样的字段在mongodb中进行地理空间索引:

"geometry": [{"latitude": 84.2, "longitude": 24.2,"time":395384351,"status":"Green"},{"latitude": 84.2, "longitude": 24.2, "time":395384352,"status":"Red"},{"latitude": 84.2, "longitude": 24.2, "time":395384353,,"status":"Blue"}]

或者必须是这样的:

"geometry": [[lat,lng],[lat,lng],[lat,lng],[lat,lng]]

这是肯定的吗?或者是不可能的?

1 个答案:

答案 0 :(得分:0)

所以我做了一点测试。这是我的地理集合中的数据:

{ "_id" : ObjectId("536093e9e3c1d506da48a079"), "loc" : [ 120, 110 ] }
{ "_id" : ObjectId("5360940be3c1d506da48a07a"), "loc" : { "lat" : 120, "lng" : 130 } }
{ "_id" : ObjectId("53609422e3c1d506da48a07b"), "loc" : { "latitude" : 120, "lngitude" : 140 } }
{ "_id" : ObjectId("5360942be3c1d506da48a07c"), "loc" : { "latitude" : 120, "lngitude" : 150, "time" : 133232004 } }

我犯了一些法术错误,以确保名称无关紧要 一旦我用以下内容构建索引:

db.geo.ensureIndex({loc: "2d"});

我现在可以找到$ near运算符。
2d index doc

中所述
  

数组的值可以是数组,如[55.5,42.3]或嵌入文档,如{lng:55.5,lat:42.3}

当对象中有额外的字段时,结果是可以的。只要前2个属性是经度和纬度。它给出了正确的结果:

rs0:PRIMARY> db.geo.find({loc: {$near: [120, 150]}});
{ "_id" : ObjectId("5360942be3c1d506da48a07c"), "loc" : { "latitude" : 120, "lngitude" : 150, "time" : 133232004 } }
{ "_id" : ObjectId("53609422e3c1d506da48a07b"), "loc" : { "latitude" : 120, "lngitude" : 140 } }
{ "_id" : ObjectId("5360940be3c1d506da48a07a"), "loc" : { "lat" : 120, "lng" : 130 } }
{ "_id" : ObjectId("536093e9e3c1d506da48a079"), "loc" : [ 120, 110 ] }

此外,当您在该字段上有2d索引时,它将阻止您插入无效数据,如:

rs0:PRIMARY> db.geo.insert({loc: {str: "string", latitude: 120, lngitude: 140, time: 133232004}} );
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 16804,
        "errmsg" : "insertDocument :: caused by :: 16804 location object expected, location array not in correct format"
    }
})

然而,因为索引始终接受第一个字段作为经度,第二个字段作为纬度。您的数据似乎不符合要求。