数组中的MongoDB地理空间查询始终返回完整文档

时间:2017-05-12 11:16:48

标签: mongodb spatial-query

在MongoDB中有一个如下所示的集合:

{
"_id" : "7613035010550",
"purchases" : [ 
    {
        "date" : ISODate("2017-04-15T14:15:00.000Z"),
        "coords" : {
            "lon" : 43.729604,
            "lat" : 1.416017
        },
        "metar" : {},
        "quantity" : 1,
        "price" : 2.31
    }, 
    {
        "date" : ISODate("2017-05-02T16:23:00.000Z"),
        "coords" : {
            "lon" : 43.722862,
            "lat" : 1.415837
        },
        "metar" : {},
        "quantity" : 6,
        "price" : 12
    }, 
    {
        "date" : ISODate("2017-05-02T18:32:00.000Z"),
        "coords" : {
            "lon" : 46.307353,
            "lat" : 3.28937
        },
        "metar" : {},
        "quantity" : 2,
        "price" : 5
    }
],
"rates" : [ 
    {
        "value" : 5
    }, 
    {
        "value" : 4
    }, 
    {
        "value" : 5
    }, 
    {
        "value" : 2
    }
]
}

并且想要查询只能返回在一个点周围的定义半径(即5公里)内完成的购买并且仅针对id ...但我不知道如何处理这种查询

尝试此查询:

db.getCollection('stats').find({"purchases.coords":{$geoWithin:{$centerSphere: [[43.688935, 1.401541], 25 / 6378.1]}}})

但是返回整个文件......我想能够返回类似于在定义的半径范围内进行的一系列购买,即在我的例子中只有那两个:

        {
        "date" : ISODate("2017-04-15T14:15:00.000Z"),
        "coords" : {
            "lon" : 43.729604,
            "lat" : 1.416017
        },
        "metar" : {},
        "quantity" : 1,
        "price" : 2.31
    }, 
    {
        "date" : ISODate("2017-05-02T16:23:00.000Z"),
        "coords" : {
            "lon" : 43.722862,
            "lat" : 1.415837
        },
        "metar" : {},
        "quantity" : 6,
        "price" : 12
    }

我如何实现这种查询......或者...如何定义我的集合以便能够进行这种查询?

THX,

JL

1 个答案:

答案 0 :(得分:0)

出于您的目的,我建议您使用阶段为projectunwind的汇总。

现在无法检查,但它应该是这样的:

db.getCollection('stats').aggregate([
    {'$match': {
        "purchases.coords": {$geoWithin:{$centerSphere: [[43.688935, 1.401541], 25 / 6378.1]}}
    }},
    {'$project': {
        "_id": 0, // 0 - if you don't need document id
        "purchases": 1,
    }},
    {'$unwind': "$purchases"},
    {'$match': {
        "purchases.coords": {$geoWithin:{$centerSphere: [[43.688935, 1.401541], 25 / 6378.1]}}
    }},
])

我使用了2个相同的匹配项:

  1. 匹配符合指定条件的所有文件。
  2. 匹配所有未购买的'购买'匹配指定的条件。
  3. 您可以在没有第一次匹配的情况下使用此聚合,但可能会慢一些。

    您可以看到它是如何工作的如果您评论所有阶段然后逐个取消注释。