Như thông báo lỗi đã chỉ ra, điều này là do bạn có nhiều hơn một 2dsphere chỉ mục, vì vậy $geoNear không biết sử dụng cái nào.
Trong tình huống này, bạn có thể:
- giảm chỉ mục địa lý thứ hai hoặc
- sử dụng khóa
keytham số như đã đề cập trong tài liệu $ geoNear :
Lỗi cũng được đề cập trong tài liệu:
Bạn có thể sử dụng db.collection.getIndexes () để liệt kê tất cả các chỉ mục được xác định trên bộ sưu tập.
Đây là một ví dụ về việc sử dụng khóa key tham số:
> db.test.insert([
{_id:0, loc1:{type:'Point',coordinates:[1,1]}, loc2:{type:'Point',coordinates:[2,2]}},
{_id:1, loc1:{type:'Point',coordinates:[2,2]}, loc2:{type:'Point',coordinates:[1,1]}}
])
Sau đó, tôi tạo hai 2dsphere chỉ mục:
> db.test.createIndex({loc1:'2dsphere'})
> db.test.createIndex({loc2:'2dsphere'})
Đang chạy $geoNear mà không chỉ định key sẽ xuất ra lỗi:
> db.test.aggregate({$geoNear:{near:{type:'Point',coordinates:[0,0]},distanceField:'d'}})
...
"errmsg": "more than one 2dsphere index, not sure which to run geoNear on",
...
Sử dụng khóa key: loc1 sẽ sắp xếp kết quả theo loc1 chỉ mục (_id: 0 đứng trước _id: 1 ):
> db.test.aggregate(
{$geoNear: {
near: {type: 'Point',coordinates: [0,0]},
distanceField: 'd',
key: 'loc1'}})
{ "_id": 0, "loc1": { "type": "Point", "coordinates": [ 1, 1 ] }, "loc2": { "type": "Point", "coordinates": [ 2, 2 ] }, "d": 157424.6238723255 }
{ "_id": 1, "loc1": { "type": "Point", "coordinates": [ 2, 2 ] }, "loc2": { "type": "Point", "coordinates": [ 1, 1 ] }, "d": 314825.2636028646 }
Và, sử dụng key: loc2 sẽ sắp xếp kết quả theo loc2 chỉ mục (_id: 1 đứng trước _id: 0 ):
> db.test.aggregate(
{$geoNear: {
near: {type: 'Point',coordinates: [0,0]},
distanceField: 'd',
key: 'loc2'}})
{ "_id": 1, "loc1": { "type": "Point", "coordinates": [ 2, 2 ] }, "loc2": { "type": "Point", "coordinates": [ 1, 1 ] }, "d": 157424.6238723255 }
{ "_id": 0, "loc1": { "type": "Point", "coordinates": [ 1, 1 ] }, "loc2": { "type": "Point", "coordinates": [ 2, 2 ] }, "d": 314825.2636028646 }