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
key
tham 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 }