MongoDB:如何对嵌套位置属性执行空间查询?

时间:2019-06-25 05:43:05

标签: mongodb mongodb-query aggregation-framework

我有一个这样的文档结构:

{
    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,我只想在响应中添加John的第一个地址:

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

我见过类似的示例,但是它们都返回整个文档,即它们将返回John的所有地址。如何仅返回查询坐标$附近的地址(可能有多个地址,因此x操作符无效)?

P.S。 -我确实尝试过放松,然后检查(使用聚合框架),但这不允许我在管道的第一阶段以外的任何其他地方使用空间查询。

1 个答案:

答案 0 :(得分:-1)

首先,您应该检查存在多少个地址。然后,如果大于0,则可以使用切片方法。如果地址数组的长度为零,则返回null。

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
    }
}
])