2016-06-03 3 views
1

У меня есть документы с точками GeoJSON, и я хочу их подсчитать по квадрату с помощью координат. Для этого я вычитаю свою широту/долготу с модулем той же широты/долготы и размерностью квадрата.

я получил ошибку:

"errmsg" : "$mod only supports numeric types, not Array and NumberDouble" 

Я не понимаю, потому что я использую точечную нотацию для извлечения широты и долготы. Почему он говорит, что это массив?

У меня не было проблем с использованием одного и того же запроса, но с координатами, хранящимися в двух разных свойствах, а не внутри одного и того же массива.

Пример документа:

{ 
"_id" : ObjectId("560dcd15491a065d6ab1085c"), 
"nodeLoc" : 
    { 
     "type" : "Point", 
     "coordinates" : 
     [ 
       2.352221, 
       48.856612 
     ] 
    } 
} 

Aggregation:

db.collection.aggregate(
     [ 
      { 
       $group: 
       { 
        _id: 
        { 
         latGroup: {$subtract: ["$nodeLoc.coordinates.1", {$mod: ["$nodeLoc.coordinates.1", 0.5]}]}, 
         lonGroup: {$subtract: ["$nodeLoc.coordinates.0", {$mod: ["$nodeLoc.coordinates.0", 0.5]}]}, 
        }, 
        count: {$sum: 1} 
       } 
      } 
     ] 
    ) 

Я ожидаю, что результат, как это:

latGroup : 2 lonGroup : 48,5 count : 1 
... 

Заранее спасибо

ответ

1

Начиная с MongoDB 3.2, вы Можно используйте оператор $arrayElemAt для возврата элемента по определенному индексу.

db.collection.aggregate([ 
    { "$group": { 
     "_id": { 
      "latGroup": { 
       "$subtract": [ 
        { "$arrayElemAt": [ "$nodeLoc.coordinates", 1 ] }, 
        { "$mod": [ 
         { "$arrayElemAt": [ "$nodeLoc.coordinates", 1 ] }, 
         0.5 
        ]} 
       ] 
      }, 
      "longGroup": { 
       "$subtract": [ 
        { "$arrayElemAt": [ "$nodeLoc.coordinates", 0 ] }, 
        { "$mod": [ 
         { "$arrayElemAt": [ "$nodeLoc.coordinates", 0 ] }, 
         0.5 
        ]} 
       ] 
      } 
     }, 
     "count": { "$sum": 1 } 
    }} 
]) 

От MongoDB версии < = 3.0, необходимо де-нормализовать «координаты» массив, то первый $group по _id" и использовать $first и $last аккумулятор, который, соответственно, вернуть первое и последнее значение в «координатах» массив. Оттуда вы можете легко перегруппировать свои документы с помощью оператора $mod.

db.collection.aggregate([ 
    { "$unwind": "$nodeLoc.coordinates" }, 
    { "$group": { 
     "_id": "$_id", 
     "latGroup": { "$first": "$nodeLoc.coordinates" }, 
     "longGroup": { "$last": "$nodeLoc.coordinates" } 
    }}, 
    { "$group": { 
     "_id": { 
      "latgroup": { 
       "$subtract": [ 
        "$latGroup", 
        { "$mod": [ "$latGroup", 0.5 ] } 
       ] 
      }, 
      "lonGroup": { 
       "$subtract": [ 
        "$longGroup", 
        { "$mod": [ "$longGroup", 0.5 ] } 
       ] 
      } 
     }, 
     "count": { "$sum": 1 } 
    }} 
]) 
+0

Благодарим за помощь – SwissFr

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