Лучшая практика запроса ссылочных коллекций? - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть 3 коллекции, Страна, Штат и Город, которые структурированы следующим образом:

Country -> State -> -> City

Вот схемы:

const Country = new Schema(
    {
        disabled: true
    }
);

const State = new Schema(
    {
        countryID: {type: Schema.Types.ObjectId, ref: "Country"},
        timeZone: String,
        ...
    }
);

const City = new Schema(
    {
        countryID: {type: Schema.Types.ObjectId, ref: "Country"},
        stateID: {type: Schema.Types.ObjectId, ref: "State"},
        ...
    }
);

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

let countryIDs = await Country.find({disabled: false}).distinct("_id");
let stateIDs = await State.find({countryID: {$in: countryIDs}, timeZone: "PST"}).distinct("_id");
let cities = await City.find({stateID: {$in: stateIDs}});

Когда я запускал приведенный выше код каждые 20 раз в секунду для запуска проверок с использованием переменной city,ЦП моего сервера MongoDB был установлен на 100%.

Существует ли эффективный способ получения City документов, связанных с State документами, которые находятся в заданном часовом поясе и связанных с Country документами, которые disabled: false?

Обновление:

Единственное решение, о котором я могу подумать, - это добавить поля timeZone и disabled в коллекции City.Таким образом, я могу просто запросить коллекцию City.Мне не нравится эта идея, потому что я не хочу поддерживать timeZone и disabled в нескольких местах, кажется подверженным ошибкам.Любые другие идеи или это лучший подход?

1 Ответ

0 голосов
/ 23 сентября 2018

Вы можете использовать aggregate и lookup.

    db.getCollection('country').aggregate([
{$match :  { "disabled" : true} },
 {
     $lookup:
       {
         from: "state",
         localField: "_id",
         foreignField: "countryId",
         as: "state"
       }
  },
  {
  $unwind:
    {
      path: '$state',
      preserveNullAndEmptyArrays: true
    }
},
{$match : {"state.timeZone" : "PST"}},
  {
     $lookup:
       {
         from: "city",
         localField: "state._id",
         foreignField: "stateId",
         as: "city"
       }
  },
  { $group : {
      _id : '$_id',
      disabled : {$first : '$disabled'},
      name : {$first : '$name'},
      state : {$push : '$state'},
      city : {$first : '$city'}
      }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...