gpt4 book ai didi

MongoDB查询: $near with aggregation

转载 作者:IT老高 更新时间:2023-10-28 13:15:31 26 4
gpt4 key购买 nike

我有一个类似的收藏

{
"_class" : "User",
"_id" : "id1",
"places" : [
{
"_id" : "1",
"address" : "test1",
"location" : {
"latitude" : 1,
"longitude" : 1
}
},
{
"_id" : "2",
"address" : "test2",
"location" : {
"latitude" : 2,
"longitude" : 2
}
},...
]
}

我正在尝试检索用户的每个位置(2 公里范围内)。此查询不起作用:

db.users.ensureIndex({"places.location":"2d"})

db.users.aggregate([
{$match : { "_id" : "id1" } },
{$unwind : "$places"},
{$project:{_id:0, places:1},
{$match :
{"places.location" :
{ $near :
{ $geometry :
{ type : "2d" ,
coordinates : [ -1 , -2 ]
}
},
$maxDistance : 2000
}
}
}])



Error: Printing Stack Trace
at printStackTrace (src/mongo/shell/utils.js:37:15)
at DBCollection.aggregate (src/mongo/shell/collection.js:897:9)
at (shell):1:10
JavaScript execution failed: aggregate failed: {
"errmsg" : "exception: $near is not allowed inside of a $match aggregation expression",
"code" : 16424,
"ok" : 0

我不知道如何将 $near 与聚合一起使用。

当我尝试时

db.users.find(
{
"places.location" :
{ $near:
{ $geometry :
{ type : "2d" ,
coordinates : [ -1 , -2 ] }
},
$maxDistance : 2000
}
}

它返回给我 n 次给定用户(n = 用户的每个地方),这就是为什么我决定使用聚合,但我被卡住了。

提前谢谢

编辑

我试过 $geoNear :

db.users.aggregate(                      
{$geoNear : {
near: [-1, 1],
distanceField: "distance",
query : {"_id" : "id1"},
uniqueDocs: true,
maxDistance : 2000 // In the specs, distance has to be in radians
}})

它会返回给我整个用户(包括所有地方,甚至是最远的地方)。

所以我需要在搜索正确的位置之前修改文档。

  1. 检索正确的用户(匹配)
  2. 放松用户的每一个地方
  3. 然后搜索 2 公里范围内的每个地方(近/近)
  4. reshape 结果(项目)

我期待的结果是这样的:

"result" : [
{
"_id" : "1",
"location" : {
"latitude" : 1,
"longitude" : 1
}
},
{
"_id" : "2",
"location" : {
"latitude" : 2,
"longitude" : 2
}
}
]}

问题是我不能使用$geoNear之前的其他阶段,我的搜索参数必须在“查询”字段中指定。我收到以下错误:

$geoNear is only allowed as the first pipeline stage

最佳答案

您必须使用 $geoNear ,并且仅当您使用 V2.4 及更高版本时

db.users.aggregate(   
{$geoNear : {
near: [-1, -2],
distanceField: "distance",
query : {"_id" : "id1"},
uniqueDocs: true,
maxDistance : 2000
}})

编辑:编辑问题后

下面的查询将为您提供位置和距离,但不检索内部(数组元素)_id

db.users.aggregate(   
{$geoNear : {
near: [-1, -2],
distanceField: "distance",
includeLocs: "location",
query : {"_id" : "id1"},
maxDistance : 2000
}},
{$project : {"location" : 1, "_id" : 0, "distance" : 1}}
)

注意添加includeLocs和删除uniqueDocs: true

要同时检索内部 _id,您必须(按照此示例)展开并有条件地进行项目左右,但我认为这不值得,除非您需要地址而不是 _id

关于MongoDB查询: $near with aggregation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21650385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com