user644745
user644745

Reputation: 5723

mongo: "2d" index and normal index

location: {lat: Number,
           lng: Number}

location is a 2d index in my mongodb and I have been using this for geospatial search, which is working fine.

Now if I need to search as db.find({lat:12.121212, lng:70.707070}), will it use the same index ? or, do I need to define a new index ? If so, how ?

I am using mongoose driver in node.js

Upvotes: 1

Views: 464

Answers (1)

Adam Comerford
Adam Comerford

Reputation: 21692

The 2d index used for doing the geospatial commands is not going to help for an equivalency match on the two fields. For that you will need to define a compound index on the two sub-documents, something like this:

db.collection.ensureIndex({"location.lat" : 1, "location.lng" : 1})

This worked best for me with a test set of data - you can also define a normal index on the location field itself but that will be less efficient. You can test out the relative performance using hint and explain for any index combination. For example:

db.collection.find({"location.lat" : 179.45, "location.lng" : 90.23}).hint("location.lat_1_location.lng_1").explain()

You can do this for any index you wish in fact, though to check the results returned you will need to drop the .explain()

Please also bear in mind that a query can only use one index at a time, so if you are looking to combine the two (equivalency and a geospatial search) then the 2d index will be the only one used.

Note: all of the above examples are from the MongoDB JS shell, not node.js

Upvotes: 1

Related Questions