检索基于数据的日期mongodb

时间:2015-11-15 10:17:45

标签: node.js mongodb mongoose

我创建了一个包含2个模型的应用,其中匹配指的是特定联盟。从此我不想查询以获得所有即将到来的比赛的联赛。我该怎么做或者我应该改变模型的结构?我试图提出一个查询但是这会返回所有即将到来的比赛,而不是即将到来的比赛的联赛

模型

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);     
    });

2 个答案:

答案 0 :(得分:1)

我会改变你的模特。如果我是你,我会合并这两个模型,所以你会得到这样的东西:

var leagueSchema = new Schema({
    _id: Number,
    name: String,
    league: Number,
    matches: [{
        date: Date,
        homeName: String,
        awayName: String
    }]
});

不要使用两个模型,而是直接为您的联盟架构添加匹配项。使用$push$addToSet属性更新文档时,可以非常轻松地完成此操作。

如果您想要添加对象,请使用$push。如果要添加项目(如果该项目不存在),请使用$addToSet。只查询唯一项目的查询将如下所示:

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

以上查询$unwinds所有数组对象,然后单独匹配所有项目。

答案 1 :(得分:0)

你可以使用distinct来获取所有联盟参考,然后做你想做的任何事情 他们:

 Match.find({"date":{ "$gte": oneWeekAgo }}).distinct('league', function (err, leaguesRef) {
            //      
        });

或者

Match.distinct('league', {"date":{ "$gte": oneWeekAgo }}, function (err, leaguesRef) {
        //      
    });
相关问题