使用查询过滤MongoDB geoNear命令

时间:2011-11-05 00:36:12

标签: mongodb geospatial

我有一个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}}是我想要的吗?提前致谢。

1 个答案:

答案 0 :(得分:1)

这是因为您将其他文档中的位置嵌入。即使位置运算符$存在,Mongodb也没有能力(截至目前)只返回子文档。 $ operator目前用于更新特定的子文档。

这是过滤多级嵌入文档的行为,通常匹配过滤器会返回整个文档,而不是子集。

因此您需要更改您的doc结构。而不是在doc中存储多个位置,将它们拆分为单独的doc。它将提供你想要的能力。

有关详细信息,请参阅How to make a query in this nested document structure (MongoDB)?