MongoDB - И запрос на массив с элементом GeoJSON - PullRequest
0 голосов
/ 21 сентября 2018

Я смотрел на другие вопросы, не находя подходящего ответа для своей проблемы, поэтому я надеюсь, что вы мне поможете.

СИТУАЦИЯ
В настоящее время я работаю над приложением локализации с MongoDB.На данный момент я тестирую свои запросы в оболочке MongoDB.
У меня есть коллекция Point документов с указанием местоположений.Я использую GeoJSON объекты для координат моей точки.

Вот как выглядит документ Point:

{  
    _id: "Roma_DellArte",  
    localisations: [  
        { location_type_id: 1, location: { type: "Point", coordinates: [ 41.9097306,12.2558141 ] } }  
    ]  
}

My location_type_id относится к другой коллекции, просто вы должны знать.

Я уже сделал запрос, который возвращает все точки около точного местоположения:

db.point.createIndex({ 'localisations.location': "2dsphere" })  

db.point.find({  
    'localisations.location': {  
        $near: {  
            $geometry: { type: "Point",  coordinates: [ 48.8588377, 2.2770207 ] },  
            $minDistance: 0,  
            $maxDistance: 100000  
        }  
    } 
})  

Теперь я хотел бы запросить все точки, находящиеся рядом с точным местоположением И те с определенным location_type_id.

ПРОБЫ И ОТКАЗЫ
Я пробовал много запросов в оболочке MongoDB, но ни один из них не дал удовлетворительного результата.

Запрос 1 Я думаю, он ничего не возвращает, потому что location: не является точным полем.

db.point.createIndex({ location: "2dsphere" })  

db.point.find({  
    'localisations': {  
        location_type_id: 1,  
        location: {  
            $near: {  
                $geometry: { type: "Point", coordinates: [ 48.8588377, 2.2770207 ] },  
                $minDistance: 0,  
                $maxDistance: 100000  
            }  
        }  
    }   
})  

Запрос 2
Основная проблема заключается в том, что он получает точечный документ, если в поле localisations есть объект с правильным location_type_id и объект с правильным location.Это не обязательно тот же объект, которым я хочу быть.
см .: https://docs.mongodb.com/manual/tutorial/query-array-of-documents/#combination-of-elements-satisfies-the-criteria - второй абзац в конце.

db.point.createIndex({ 'localisations.location': "2dsphere" })

db.point.find({  
    'localisations.location_type_id': 1,  
    'localisations.location': {  
        $near: {  
            $geometry: { type: "Point", coordinates: [ 48.8588377, 2.2770207 ] },  
            $minDistance: 0,  
            $maxDistance: 100000  
        }  
    }   
}) 

Запрос 3
Я хотел попробовать этот метод: https://docs.mongodb.com/manual/tutorial/query-arrays/#query-for-an-array-element-that-meets-multiple-criteria

db.point.createIndex({ location: "2dsphere" })  

db.point.find({ 
    localisations: {   
        $elemMatch: {  
            location_type_id: 1, 
            location: { 
                $near: {   
                    $geometry: { type: "Point", coordinates: [ 48.8588377, 2.2770207 ] },  
                $minDistance: 0,  
                $maxDistance: 100000  
                }  
            }  
        }  
    }   
})

К сожалению, я получаю эту ошибку:

Error: error: {  
    "ok" : 0,  
    "errmsg" : "geoNear must be top-level expr",  
    "code" : 2,  
    "codeName" : "BadValue"  
}  

Теперь вы знаете все, я надеюсь, что вы можетепомоги мне.

...