2015-04-02 4 views
0

У меня есть коллекция MongoDB структурирована следующим образом:MongoDB геопространственной запрос

/* 1 */ 
{ 
    "_id" : ObjectId("551c53f3ecba12e015000045"), 
    "nome" : "istituzione1", 
    "username" : "username1", 
    "email" : "[email protected]", 
    "pwd" : "189bbbb00c5f1fb7fba9ad9285f193d1", 
    "punti" : [{ 
     "punto_id" : ObjectId("551c5415ecba12e015000046"), 
     "nome" : "ORACLE", 
     "loc" : [-122.262168, 37.531595], 
     "icona" : 2, 
     "youtubelink" : "", 
     "immagini" : [{ 
      "imgid" : ObjectId("551c5d3eecba12e015000084"), 
      "contenttype" : "image/jpeg" 
     }, { 
      "imgid" : ObjectId("551c5d96ecba12e01500008a"), 
      "contenttype" : "image/jpeg" 
     }] 
    }, { 
     "punto_id" : ObjectId("551c5420ecba12e015000047"), 
     "nome" : "GOOGLE\r\n", 
     "loc" : [-122.083983, 37.422969], 
     "icona" : 2, 
     "youtubelink" : "", 
     "immagini" : [] 
    }, { 
     "punto_id" : ObjectId("551c5d74ecba12e015000089"), 
     "nome" : "YAHOO", 
     "loc" : [-122.025061, 37.428061], 
     "icona" : 1, 
     "youtubelink" : "", 
     "immagini" : [{ 
      "imgid" : ObjectId("551c5da4ecba12e01500008e"), 
      "contenttype" : "image/jpeg" 
     }, { 
      "imgid" : ObjectId("551c5daaecba12e015000092"), 
      "contenttype" : "image/jpeg" 
     }, { 
      "name" : "Penguins.jpg", 
      "imgid" : ObjectId("551c5dfeecba12e015000096"), 
      "contenttype" : "image/jpeg" 
     }] 
    }] 
} 

я создал 2d индекс на «LOC» массив внутри «Punti», и я пытаюсь сделать, чтобы геопространственном запрос, как это:

db.istituzioni.find({ "punti.loc" : { $geoWithin : { $centerSphere : [ [ -121.931076, 37.364700 ], 14.5/6371 ] } } }) 

Этот запрос должен возвращать только элемент из «Punti» с полем «нома» установлен в «YAHOO» (я проверил это создание другой коллекции containig только «LOC» и «Нома» поля), но он возвращает всю коллекцию.
Я пробовал разные значения km и обнаружил, что при значении> = 10,9 км он возвращает всю коллекцию, а если значение < 10,9 км, запрос ничего не возвращает.
Что я делаю неправильно?

ответ

1

Запросы возвращают документы, а не элементы массивов в документах. Если вы хотите, чтобы запрос возвращал только элемент из punti, вы должны изменить структуру своего документа или создать другой набор, заполненный элементами punti.

Вы также можете использовать позиционный оператор $ в проекции вернуть punti массив только с первым элементом, который соответствует условию запроса:

db.istituzioni.find(
    { "punti.loc" : { $geoWithin : { $centerSphere : [ [ -121.931076, 37.364700 ], 14.5/6371 ] } } }, 
    { "punti.$" : 1 } 
) 
+0

Спасибо! Оно работает. – ajeje93

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