MongoDB: Как выполнить пространственные запросы к вложенным свойствам местоположения? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть такая структура документа:

{
    name: "John",
    addresses: [
        {
            city: "London",
            location: {
                type: "Point",
                coordinates: [0, 0]
            }
        },
        {
            city: "New York",
            location: {
                type: "Point",
                coordinates: [-74, 40]
            }
        }
    ]
},
{
    name: "Joanna",
    addresses: [
        // Similar array of her addresses
    ]
}

Теперь у меня есть координата x = (0.0001, 0.0001).Я хочу, чтобы все люди в моей коллекции имели адрес, близкий к этой точке , и получали только эти адреса в ответе .Для координаты запроса как x мне нужен только первый адрес Джона в ответе:

{
    name: "John",
    addresses: [
        {
            city: "London",
            location: {
                type: "Point",
                coordinates: [0, 0]
            }
        }
    ]
}

Я видел похожие примеры, но все они возвращают весь документ, то есть возвращают все Джон.адреса.Как вернуть только адреса (их может быть больше одного, следовательно, оператор $ не будет работать), которые находятся вблизи координаты запроса x?

PS- Я попытался развернуть и затем проверить (используя структуру агрегации), но это не позволяет мне использовать пространственный запрос где-либо еще, кроме первой стадии конвейера.

1 Ответ

0 голосов
/ 25 июня 2019

Во-первых, вы должны проверить, сколько существует адресов.Тогда, если больше 0, вы можете использовать метод среза.Если длина массива адресов равна нулю, вернуть ноль.

db.collection.aggregate([
{
    {$addFields: {'addressCount': {$size: '$addresses'}}},
    {$addFields: {'firstAddress': {
        $cond: {
            if: { $gt: ['$addressCount', 0]},
            then: { "$slice" : [ "$addresses" , 0, 1 ] },
            else: null
        }}
    }},
    "$project": {
        "name": 1,
        "firstAddress" : 1
    }
}
])
...