查询参考馆藏的最佳实践?

时间:2018-09-22 02:59:59

标签: mongodb mongoose

我有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"},
        ...
    }
);

我一直在运行以下代码,以仅获取与禁用国家/地区无关的城市:

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秒钟运行一次以上代码以使用citys变量运行检查时,我的MongoDB服务器的CPU固定为100%。

是否有一种有效的方法来获取与给定时区中的City个文档相关联并与StateCountry文档相关联的disabled: false个文档?

更新:

我能想到的唯一解决方案是将timeZonedisabled字段添加到City集合中。这样,我就可以查询City集合。我不喜欢这个想法,因为我不想在多个位置维护timeZonedisabled,这似乎容易出错。还有其他想法还是最好的方法?

1 个答案:

答案 0 :(得分:0)

您可以使用aggregatelookup

    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'}
      }
  }
])