2015-11-15 199 views
1

我已經創建了一個應用程序與2個模型,其中匹配指的是一個特定的聯賽。從這我不想做一個查詢來獲得所有即將到來的比賽的聯賽。我該怎麼做,或者我應該改變模型的結構?我試圖做一個查詢然而,這將返回所有即將開始的比賽,而不是聯賽與即將開始的比賽檢索基於數據的日期mongodb

模式

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

回答

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所有的數組對象,然後seperatly相匹配的所有項目。

+0

好吧,但我會如何將比賽添加到特定的聯賽? –

+0

@PeterPik我在問題的中間添加了一個示例。 –

+0

一些相同的比賽可能會被推到同一聯賽,在這種情況下,我會在哪裏放置'upsert:true'? –

0

您可以使用不同的讓所有聯賽裁判,然後做任何你想要的 他們:

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

或者

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

這將檢索leagueIds,我如何將名稱添加到輸出中? –

+0

你不能在一個簡單的查詢中,然後你需要使用$ in和你的列表對聯賽進行查詢。 無論如何,我認爲你應該像ThomasBormans所建議的那樣重新考慮你的設計。 –