猫鼬填充虚拟对象-如果foreignField为null或空数组,则从查询结果中排除localField和foreignField

时间:2019-09-19 15:18:40

标签: javascript mongodb mongoose mongoose-populate

我有一个简单的问题。

在猫鼬中,我有两个模型。一个用于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>

感谢任何帮助或可能的选择。

0 个答案:

没有答案