我有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
个文档相关联并与State
个Country
文档相关联的disabled: false
个文档?
我能想到的唯一解决方案是将timeZone
和disabled
字段添加到City
集合中。这样,我就可以查询City
集合。我不喜欢这个想法,因为我不想在多个位置维护timeZone
和disabled
,这似乎容易出错。还有其他想法还是最好的方法?
答案 0 :(得分:0)
您可以使用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'}
}
}
])