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和您的列表查询联赛。不管怎样,我认为你应该按照托马斯博曼斯的建议重新考虑你的设计。