Node.js 检索基于数据的日期mongodb

Node.js 检索基于数据的日期mongodb,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我已经创建了一个应用程序,其中有两个型号的比赛是指一个特定的联盟。从这里,我不想提出一个查询,以获得所有联赛,其中有即将到来的比赛。我如何才能做到这一点,或者我应该改变我的模型的结构?我试着做一个查询,但是它返回所有即将到来的比赛,而不是即将到来的联赛 型号 var mongoose = require('mongoose'), Schema = mongoose.Schema; var leagueSchema = new Schema({ _id: Number, name

我已经创建了一个应用程序,其中有两个型号的比赛是指一个特定的联盟。从这里,我不想提出一个查询,以获得所有联赛,其中有即将到来的比赛。我如何才能做到这一点,或者我应该改变我的模型的结构?我试着做一个查询,但是它返回所有即将到来的比赛,而不是即将到来的联赛

型号

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var leagueSchema = new Schema({
    _id: Number,
    name: String,
    league: Number
});

var matchSchema = new Schema({
    _id: Number,
    league: { type: Number, ref: 'league' },
    date: Date,
    homeName: String,
    awayName: String
});

var League  = mongoose.model('leagues', leagueSchema);
var Match = mongoose.model('matches', matchSchema);
保存数据

var queryData = {'_id': matchId, 'league': leagueId, 'date': date, 'homeName': homeTeam, 'awayName': awayTeam};

Match.findOneAndUpdate({'_id': matchId}, queryData, {upsert: true}, function(err, doc){
    if(err){
        console.log("Something wrong when updating data!");
    }
});
查询

var oneWeekAgo = new Date();
oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);

Match
    .find({ "date": { "$gte": oneWeekAgo } })
    .populate('league')
    .exec(function (err, matches) {
        if (err) return handleError(err);
        console.log(matches);     
    });

您可以使用distinct获得所有联赛裁判,然后使用distinct执行任何操作 他们:


我会换你的型号。如果我是你,我会合并这两个模型,这样你会得到如下结果:

var leagueSchema = new Schema({
    _id: Number,
    name: String,
    league: Number,
    matches: [{
        date: Date,
        homeName: String,
        awayName: String
    }]
});
var objectToPush = {
    homeName: 'Test',
    date: ISODate('2015-12-01')
};
League.update({league: 1}, {$addToSet: {matches: objectToPush}})
    .exec(function(err, update) {
        // Do something
    });
不要有两个模型,而是直接将匹配项添加到联赛模式中。当您使用或属性更新文档时,可以非常轻松地执行此操作

如果不管发生什么都要添加对象,请使用
$push
。如果要添加不存在的项目,请使用
$addToSet
。仅使用唯一项进行查询时,将如下所示:

var leagueSchema = new Schema({
    _id: Number,
    name: String,
    league: Number,
    matches: [{
        date: Date,
        homeName: String,
        awayName: String
    }]
});
var objectToPush = {
    homeName: 'Test',
    date: ISODate('2015-12-01')
};
League.update({league: 1}, {$addToSet: {matches: objectToPush}})
    .exec(function(err, update) {
        // Do something
    });
如果您想查询联赛,您将需要以下查询:

League.find({matches: {$elemMatch: {date: {$gte: oneWeekAgo}}}})
    .exec(function (err, matches) {
        if (err) return handleError(err);
        console.log(matches);
    });
League.aggregate([{
        $unwind: '$matches'
    }, {
        $match: {
            'matches.date': {
                $gte: ISODate('2015-11-01')
            }
        }
    }]);
这还会返回数组中与筛选查询不匹配的匹配项。如果您只需要与您的条件完全匹配的匹配项,则需要此查询:

League.find({matches: {$elemMatch: {date: {$gte: oneWeekAgo}}}})
    .exec(function (err, matches) {
        if (err) return handleError(err);
        console.log(matches);
    });
League.aggregate([{
        $unwind: '$matches'
    }, {
        $match: {
            'matches.date': {
                $gte: ISODate('2015-11-01')
            }
        }
    }]);

上面的查询<代码> $un/<代码>所有你的数组对象,然后匹配所有项目SePATALY。< /P>好,但是我如何将匹配添加到特定的联盟?@彼得皮克,我在这个问题的中间添加了一个例子。一些相同的匹配可能被推到同一个联盟,在这种情况下,我将把

upsert:true
放在哪里?@PeterPik您可以添加
upsert
作为第三个参数,但这会创建一个没有名称的联盟。因此,我建议在推送新比赛之前检查联赛是否存在(如果不存在,则创建一个)。我的意思是,同一场比赛可能会被推送几次,如何检查它是否存在?检索联赛ID,如何将名称添加到输出中?你不能在简单的查询中,然后,您需要使用$in和您的列表查询联赛。不管怎样,我认为你应该按照托马斯博曼斯的建议重新考虑你的设计。