是否可以使用像这样的字段在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]]
这是肯定的吗?或者是不可能的?
答案 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"
}
})
然而,因为索引始终接受第一个字段作为经度,第二个字段作为纬度。您的数据似乎不符合要求。