当文档包含数组文档时,mongodb日期范围过滤器错误



我有一个问题,就是在MongoDB上的数组中过滤一个包含范围的日期。

文件1:

{
"_id": {
"$oid": "61d406681512ba17533b35c9"
},
"items": [{
"_id": {
"$oid": "61d406681512ba17533b35cd"
},
"bookingEnd": {
"$date": "2022-04-22T00:00:00.000Z"
},
"bookingStart": {
"$date": "2022-03-19T00:00:00.000Z"
}
}, {
"_id": {
"$oid": "61d406681512ba17533b35cd"
},
"bookingEnd": {
"$date": "2022-07-22T00:00:00.000Z"
},
"bookingStart": {
"$date": "2022-06-19T00:00:00.000Z"
}
}],
"createdAt": {
"$date": "2022-01-04T08:33:44.958Z"
},
"updatedAt": {
"$date": "2022-01-04T08:33:44.958Z"
},
"__v": 0
}

文件2:

{
"_id": {
"$oid": "61d407c41512ba17533b35f7"
},
"items": [{
"_id": {
"$oid": "61d407c41512ba17533b35fb"
}
"bookingEnd": {
"$date": "2022-05-22T00:00:00.000Z"
},
"bookingStart": {
"$date": "2022-04-19T00:00:00.000Z"
}
}],
"createdAt": {
"$date": "2022-01-04T08:39:32.648Z"
},
"updatedAt": {
"$date": "2022-01-04T08:39:32.648Z"
},
"__v": 0
}

简历:

我有两份文件:

  1. 文档1(embebed数组上的2个元素(:
  • items.0.bookingStart:"2022-03-19T00:00:00.000Z">
  • 项目1.bookingStart:;2022-06-19T00:00:00.000Z">
  1. 文档1(embebed数组上的1个元素(:
  • items.0.bookingStart:"2022-04-19T00:00:00.000Z">

Mongo过滤器:

{ 'items.bookingStart': { $gte: ISODate('2022-03-01T00:00:00.000Z'), $lte: ISODate('2022-03-30T00:00:00.000Z') } }

Mongoose过滤器:


async findAll(params: AdminFilterOrderDto) {
const {
bookingStartInitial,
bookingStartFinal,
} = params;
const filter = {
'items.bookingStart': {
$gte: bookingStartInitial,
$lte: bookingStartFinal,
},
};
return await this.orderModel.find(filter);
}

应用的过滤器:

  1. $gte:";2022-02-01T00:00:00.000Z"$lte:";2022-02-30T000:00:00.000Z";(它没有显示任何好的东西(
  2. $gte:";2022-03-01T00:00:00.000Z"$lte:";2022-03-30T000:00:00.000Z";(它显示了一份文件。很好(
  3. $gte:";2022-04-01T00:00:00.000Z"$lte:";2022-04-30T000:00:00.000Z";(它显示两个文档。坏。它应该显示一个文档。(
  4. $gte:";2022-05-01T00:00:00.000Z"$lte:";2022-05-30T000:00:00.000Z";(它显示一个文档。糟糕。它不应该显示任何内容。(
  5. $gte:";2022-06-01T00:00:00.000Z"$lte:";2022-06-30T000:00:00.000Z";(它显示了一份文件。很好(
  6. $gte:";2022-07-01T00:00:00.000Z"$lte:";2022-07-30T000:00:00.000Z";(它没有显示任何东西。很好(

过滤器3和4给出错误的响应。

知道发生了什么事吗?是MongoDB错误还是我执行的查询错误?

谢谢你的帮助!

使用$elemMatch

db.collection.find({
items: {
$elemMatch: {
$and: [
{
"bookingStart": {
$gte: {
"$date": "2022-04-01T00:00:00.000Z"
}
}
},
{
"bookingStart": {
$lte: {
"$date": "2022-04-30T00:00:00.000Z"
}
}
}
]
}
}
})

mongoplayground

最新更新