集合(Product)有两个文件:
[
{
"_id" : ObjectId("5af00c72cdded465976dfc41"),
"dates" : [{
"start": ISODate("2018-05-01T08:21:06.152Z")
"end": ISODate("2018-05-30T08:21:06.152Z")
}],
"minutes" : [
{
"start" : 1980, //1440*1+9*60
"end" : 8400 // 1440*5+20*60
}
]
},
{
"_id" : ObjectId("5af00c72cdded465976dfc41"),
"dates" : [],
"minutes" : [
{
"start" : 1980,
"end" : 8400
},
{
"start" : 9240,
"end" : 9720
}
]
}
]
我想制定一个标准,即根据日期和分钟为
一周在1440分钟内被重新播放,一周中的几天从0开始:周日.... 6星期六。
我的问题是,当我日期为空时,文档2不会被返回,我认为问题来自 $ eq 。我尝试了 $ exists ,但它不起作用
文件编号1:
此产品将于2018-05-01至2018-05-30存放,但仅限于Mondy(早上9点)至周五(晚上20点)
文件编号2:
1 - 此产品将在Mondy(上午9点)至周五(下午20点)存放
{
"start" : 1980, //1440*1+9*60
"end" : 8400 // 1440*5+20*60
}
2-然后在星期六上午10点到下午18点
{
"start" : 9240, // 1440*6+10*60
"end" : 9720 // 1440*6+18*60
}
我的标准是:
const minutesInWeek = date.days() * 1440 + date.hours() * 60 + date.minutes();
this.pModel.
find({
$and: [
{ minutes : {
$elemMatch: {
$or : [
{ minutes: {$eq: [ ]} },
{ $and: [{start: { $lte: minutesInWeek }}, {end: { $gt: minutesInWeek }} ] }
]
}
}},
{ dates : {
$elemMatch: {
$or : [
{ dates: {$eq: [ ]} },
{ $and: [{start: { $lte: new Date() }}, {end: { $gt: new Date() }} ] }
]
}
}}
]
});;
我真的很感激这方面的帮助,谢谢!
答案 0 :(得分:1)
您应该首先$or
使用elemMatch
dates
this.pModel.
find({
$and: [
{ minutes : {
$elemMatch: {
$or : [
{ minutes: {$eq: [ ]} },
{ $and: [{start: { $lte: minutesInWeek }}, {end: { $gt: minutesInWeek }} ] }
]
}
}},
{
$or: [
{
$where: "this.dates.length == 0"
},
{
dates : {
$elemMatch: {
$or : [
{ $and: [{start: { $lte: new Date() }}, {end: { $gt: new Date() }} ] }
]
}
}
}
]
}
]
})