我有一个MongoDB集合,其中包含以下文档:
{
"_id" : ObjectId("4eb479a61258ec97acd1034d"),
"places" : [
{
"coords" : [1,0],
"remaining" : 1
},
{
"coords" : [0,0],
"remaining" : 0
},
}
我还在{places.coords: "2d", 'places.remaining':1}
我想搜索place
接近[0,0]
并且还有remaining > 0
的所有文档,以及匹配地点的coords
。
但是,运行命令
db.runCommand(
{
'geoNear':"mycollection",
near:[0,0],
query:{'places.remaining': {'$gt': 0}},
includeLocs: true
}
)
返回:
{
"ns" : "test.mycollection",
"near" : "1100000000000000000000000000000000000000000000000000",
"results" : [
{
"dis" : 0,
"loc" : {
"0" : 0,
"1" : 0
},
"obj" : {
"_id" : ObjectId("4eb479a61258ec97acd1034d"),
"places" : [
{
"coords" : [
1,
0
],
"remaining" : 1
},
{
"coords" : [
0,
0
],
"remaining" : 0
}
]
}
},
{
"dis" : 1,
"loc" : {
"0" : 1,
"1" : 0
},
"obj" : {
"_id" : ObjectId("4eb479a61258ec97acd1034d"),
"places" : [
{
"coords" : [
1,
0
],
"remaining" : 1
},
{
"coords" : [
0,
0
],
"remaining" : 0
}
]
}
}
],
"stats" : {
"time" : 0,
"btreelocs" : 0,
"nscanned" : 2,
"objectsLoaded" : 1,
"avgDistance" : 0.5,
"maxDistance" : 1.0000124312194423
},
"ok" : 1
}
即。这两个地方,即使place
coords
[0,0]
remaining = 0
db.runCommand(
{
'geoNear':"mycollection",
near:[0,0],
includeLocs: true,
query:{'foo':'bar'}
}
)
。{/ p>
我怀疑查询没有任何效果,但是当我运行时
{
"ns" : "test.mycollection",
"near" : "1100000000000000000000000000000000000000000000000000",
"results" : [ ],
"stats" : {
"time" : 0,
"btreelocs" : 0,
"nscanned" : 2,
"objectsLoaded" : 1,
"avgDistance" : NaN,
"maxDistance" : 0
},
"ok" : 1
}
没有地方被退回:
geoNear
有谁知道出了什么问题? {{1}}是我想要的吗?提前致谢。
答案 0 :(得分:1)
这是因为您将其他文档中的位置嵌入。即使位置运算符$存在,Mongodb也没有能力(截至目前)只返回子文档。 $ operator目前用于更新特定的子文档。
这是过滤多级嵌入文档的行为,通常匹配过滤器会返回整个文档,而不是子集。
因此您需要更改您的doc结构。而不是在doc中存储多个位置,将它们拆分为单独的doc。它将提供你想要的能力。
有关详细信息,请参阅How to make a query in this nested document structure (MongoDB)?