Фильтрация команд MongoDB geoNear с помощью запроса - PullRequest
1 голос
/ 05 ноября 2011

У меня есть коллекция 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'}
    }
)

места не возвращаются:

{
    "ns" : "test.mycollection",
    "near" : "1100000000000000000000000000000000000000000000000000",
    "results" : [ ],
    "stats" : {
        "time" : 0,
        "btreelocs" : 0,
        "nscanned" : 2,
        "objectsLoaded" : 1,
        "avgDistance" : NaN,
        "maxDistance" : 0
    },
    "ok" : 1
}

Кто-нибудь знает, что происходит не так? То, что я хочу, даже возможно с geoNear? Заранее спасибо.

1 Ответ

1 голос
/ 05 ноября 2011

Это потому, что у вас есть места внутри другого документа как встроенные.Mongodb не имеет возможности (на данный момент) возвращать только вложенные документы, даже если позиционный оператор $ существует.$ operator в настоящее время работает с обновлением отдельных вложенных документов.

Это поведение фильтрации многоуровневого внедренного документа, обычно соответствующий фильтр возвращает весь документ, а не подмножества.Нужно изменить структуру документа. Вместо того, чтобы хранить несколько мест внутри документа, разбейте их на отдельные документы.Это даст необходимую вам возможность.

Для получения дополнительной информации см. Как сделать запрос в этой структуре вложенного документа (MongoDB)?

...