在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
答案 0 :(得分:0)
出于您的目的,我建议您使用阶段为project和unwind的汇总。
现在无法检查,但它应该是这样的:
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个相同的匹配项:
您可以在没有第一次匹配的情况下使用此聚合,但可能会慢一些。
您可以看到它是如何工作的如果您评论所有阶段然后逐个取消注释。