检索基于数据的datemongodb

我已经创build了一个应用程序与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); }); 

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

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

而不是有两个模型,直接添加到您的联赛模式匹配。 使用$ push或$ addToSet属性更新文档时,您可以非常轻松地执行此操作。

如果你想添加对象,不pipe用什么,使用$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); }); 

这也会返回数组中的匹配,这些匹配与您的filter查询不匹配。 如果您只想匹配符合条件的匹配项,则需要使用以下查询:

 League.aggregate([{ $unwind: '$matches' }, { $match: { 'matches.date': { $gte: ISODate('2015-11-01') } } }]); 

上面的查询$unwinds所有的数组对象,然后$unwinds匹配所有项目。

你可以使用不同的来获得所有的联赛裁判,然后做任何你想要的与他们:

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

要么

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