我创建了一个包含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);
});
答案 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) {
//
});