2011-12-19 5 views
0

У меня есть геопространственная коллекция, которая хорошо работает - данный простой запрос и возвращаемые данные, как это:Фильтрация данных геопространственных данных mongodb?

> distance = db.runCommand({ geoNear : "geodata_geo", near : [-121.8993988, 36.9771729], spherical : true, maxDistance : range/earthRadius, num : 3 }).results; 
[ 
    { 
     "dis" : 0, 
     "obj" : { 
      "CountryID" : 231, 
      "_id" : ObjectId("4ecea8348044dc9bdd21eda3"), 
      "cityCode" : "3183347", 
      "cityID" : 952717, 
      "cityName" : "Aptos", 
      "countryCode" : "US", 
      "countryName" : "United States", 
      "countyCode" : "US005044", 
      "countyID" : 5932, 
      "countyName" : "Santa Cruz", 
      "**id_geo**" : 952717, 
      "lat" : 36.9771728515625, 
      "loc" : { 
       "lon" : -121.8993988, 
       "lat" : 36.9771729 
      }, 
      "lon" : -121.89939880371094, 
      "regionCode" : "NAm", 
      "regionID" : 1078, 
      "regionName" : "North America", 
      "stateCode" : "US005", 
      "stateID" : 3725, 
      "stateName" : "California" 
     } 
    }, 

Есть ли способ, чтобы сформировать этот запрос, так что я только вернуть (список) значения id_geo из в коллекции? Я пробовал несколько вариантов, но никто, кажется, не дает мне то, что мне нужно ... Я знаю, что могу справиться с этим программно, но задавался вопросом, было ли это mongopossible ...

спасибо!

ответ

1

Вам действительно нужен geoNear? docs указывают, что «предпочтительный синтаксис find() выше».

Если вы в порядке с find(), то это легко. Возвращаясь не все поля:

db.customers.find({ "addresses.billing_address.location" : 
    { $within : { $center : [[-117.15,32.72],0.15] } } } 
) 

Возвращаясь одни и те же документы, но только поле ACCOUNT_TYPE:

db.customers.find({ "addresses.billing_address.location" : 
    { $within : { $center : [[-117.15,32.72],0.15] } } }, {"account_type" : 1} 
) 
+0

спасибо за ответ. Мне нужен был geoNear, чтобы получить distanceFrom, возвращенный в запросе, поскольку это должно быть возвращено обратно в интерфейс. Я просто обработаю его программно в другом потоке, когда мне нужны эти данные. Две птицы, два камня. ... Еще раз спасибо –

+0

В этом случае вам действительно нужно geoNear. Я полагаю, что единственное, что вы можете сделать, это обработать его, как вы предлагаете. Ну ... это и зарегистрировать его как запрос расширения. – mdahlman

0

Попробуйте указать параметр fields:

db.runCommand({ geoNear : "geodata_geo", 
       near : [-121.8993988, 36.9771729], 
       spherical : true, 
       maxDistance : 45, 
       num : 3 }, 
       {fields : { "obj.id_geo" : 1 } }).results; 

Это отражено в findAndModify command.

+1

Ах, нет, - что до сих пор возвращает весь набор данных. Спасибо за предложение tho ... –

+0

Извините, я ответил на это с подозрением. Я попробовал несколько разных подходов сейчас, и я не мог свести результаты «geoNear» к моей воле :(Я не удалю ответ, чтобы люди могли видеть, что это не работает. – mnemosyn

Смежные вопросы