我有一个简单的问题。
在猫鼬中,我有两个模型。一个用于Leagues
,另一个用于Fixtures
。每个联赛都有一个唯一的id
,并且每个固定装置都与一个联赛相关,其密钥为league_id
。
在Leagues
模式中,我还定义了一个名为fixtures
的虚拟。
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const LeagueSchema = new Schema(
{
_id: { type: mongoose.Schema.Types.ObjectId, select: false, auto: true },
id: { type: Number, required: true, unique: true, index: true },
name: { type: String, required: true },
}
);
LeagueSchema.virtual('fixtures', {
ref: 'fixtures',
localField: 'id',
foreignField: 'league_id',
justOne: false,
});
const Leagues = mongoose.model('leagues', LeagueSchema);
const FixtureSchema = new Schema(
{
_id: { type: mongoose.Schema.Types.ObjectId, select: false },
match_id: { type: Number, required: true, index: true, unique: true },
league_id: { type: Number, required: true },
league_name: { type: String, required: true },
timestamp: { type: Number, required: true, index: true },
}
);
const Fixtures = mongoose.model('fixtures', FixtureSchema);
这是问题所在。所有联赛的名单都很大,并非所有联赛都总是有与.populate()
匹配的比赛,所以我想从查询中排除它们。
例如,如果我不希望任何灯具早于给定的时间戳,我将执行以下操作:
(async () => {
const target_time = 1568851200000;
const leagues = await Leagues
.find({})
.populate({ path: 'fixtures', match: { timestamp: { $gte: target_time } } })
.lean();
console.log(leagues);
})();
它的作用是按时间戳正确地过滤出灯具,但不会从查询中排除没有灯具的联赛。
此查询返回的内容是
当前结果:
[
{
id: 2,
name: 'Champions League',
fixtures: []
},
{
id: 5,
name: 'Europa League',
fixtures: [
[Object],
[Object],
[Object],
[Object],
]
},
{
id: 8,
name: 'Premier League',
fixtures: []
}
];
这是我要实现的目标:
所需结果:
[
{
id: 5,
name: 'Europa League',
fixtures: [
[Object],
[Object],
[Object],
[Object],
]
},
];
我知道我可以做类似leagues.filter(item => item.fixtures.length > 0)
的事情,但是此查询每秒将被调用数十次,恐怕在查询之后运行另一个过滤器会导致性能问题。 / p>
感谢任何帮助或可能的选择。