Создать индекс по диапазонам населения - PullRequest
1 голос
/ 11 мая 2019

Впервые в MongoDB, и я пытаюсь классифицировать население городов и округов в зависимости от их населения. Пример данных будет следующим:

{ "_id" : "D", "name" : "Dar-e-salaam", "pop" : 212253 }
{ "_id" : "WF", "name" : "Westfalia", "pop" : 50257}
{ "_id" : "G", "name" : "Gabon", "pop" : 369536 }
{ "_id" : "M", "name" : "Montgomery", "pop" : 102585 }
{ "_id" : "LA", "name" : "Los Angeles", "pop" : 38562 }

Я использовал этот код, чтобы получить следующую таблицу:

db.project.find({pop:{$gt: 0}}, {name:1})

{ "_id" : "LA", "name" : "Los Angeles" }
{ "_id" : "WF", "name" : "Westfalia" }
{ "_id" : "M", "name" : "Montgomery" }
{ "_id" : "G", "name" : "Gabon" }
{ "_id" : "D", "name" : "Dar-e-salaam" }

То, что я пытаюсь получить, будет выглядеть следующим образом:

{ "_id" : "S", "Locations" : ["Los Angeles"] }
{ "_id" : "M", "Locations" : ["Westfalia"] }
{ "_id" : "L", "Locations" : ["Montgomery", "Gabon"] }
{ "_id" : "V", "Locations" : ["Dar-e-salaam"] }

1 Ответ

1 голос
/ 11 мая 2019

Вы можете использовать структуру агрегации . Во-первых, используйте $project с $switch, чтобы вывести размер S, M, L или V на основе совокупности. Затем используйте $group и $push, чтобы сгруппировать документы по размеру и собрать названия местоположений в массив.

db.project.aggregate([{
  $project: {
    name: 1, 
    size: { 
      $switch: {
        branches: [
          {
            case: { $lt : [ "$pop", 50000 ] },
            then: "S"
          },
          {
            case: { $and : [ { $gte : [ "$pop", 50000 ] },
                             { $lt : [ "$pop", 100000 ] } ] },
            then: "M"
          },
          {
            case: { $and : [ { $gte : [ "$pop", 100000 ] },
                             { $lt : [ "$pop", 200000 ] } ] },
            then: "L"
          },
          {
            case: { $gte : [ "$pop", 200000 ] },
            then: "V"
          }
        ]
      }
    }
  }
}, {
  $group: {
    _id: "$size",
    Locations: { $push : "$name" }
  }
}])
...