当前位置: 首页 > 知识库问答 >
问题:

文档盗用数组文档时mongodb日期范围筛选器错误

糜征
2023-03-14

我有一个问题,就是在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
}

简历:

我有2份文件:

  1. 文档1(嵌入数组上的2个元素):
  • 项目。0.bookingStart:“2022-03-19T00:00:00.000Z”
  1. 文档1(Embed数组上的1个元素):
  • 项目。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') } }

猫鼬过滤器:


  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-30T00:00:00.000Z”(它没有显示任何好的内容)
  2. $gte:“2022-03-01T00:00:00.000Z”$lte:“2022-03-30T00:00:00.000Z”(显示一个文档。很好)
  3. $gte:“2022-04-01T00:00:00.000Z”$lte:“2022-04-30T00:00:00.000Z”(它显示两个文档。错误。它应该显示一个文档。)
  4. $gte:“2022-05-01T00:00:00.000Z”$lte:“2022-05-30T00:00:00.000Z”(它显示一个文档。不好。它不应该显示任何内容。)
  5. $gte:“2022-06-01T00:00:00.000Z”$lte:“2022-06-30T00:00:00.000Z”(显示一个文档。很好)
  6. $gte:“2022-07-01T00:00:00.000Z”$lte:“2022-07-30T00:00:00.000Z”(没有显示任何内容。很好)

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

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

谢谢你的帮助!

共有1个答案

卞云瀚
2023-03-14

使用$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

 类似资料:
  • > 每个对象表示一个重复发生的事件。该事件可以在多个日期发生。因此,请考虑以下内容: 我有一个日历在客户端,用户可以选择一个日期范围。 > 对所选日期范围的每个条目进行调用,并在客户端处理聚合。问题是会有大量的读取,因为我们会多次读取重叠的日期范围内的同一个列表对象。 尝试使用类似ElasticSearch/Algolia的服务来完成此操作 任何建议都会很有帮助!

  • b)“Units”字段包含带有“period”字段的子文档(日期对象数组),其中给定的日期位于数组中的第一和第二元素之间。 数据结构如下所示: 我尝试使用.find()和.aggregate()的各种组合,例如在periol数组上使用$project和$filter,在unit._id上使用$elemmatch之后使用$elemmatch,但是没有用--我得到了诸如“不能在数组上使用$filter

  • 问题内容: 我正在尝试使用Spring查询Mongo存储库并过滤数组子文档。我已经参考过如何使用mongodb过滤子文档中的数组,但是想知道是否有更合适的方法或Java结构化方法来使用Spring。 我当前正在使用速记存储库接口符号,但是我正在获取未过滤数组的完整文档。 PersonRepository.java 人.java 地址.java 样本输入 预期产量 实际产量 问题答案: 好吧,在Sp

  • 我正在尝试添加一个带有日期范围筛选器的服务器端datatable实现。筛选器不筛选任何数据。我不知道它坏在哪里。需要你帮我弄清楚我错在哪里。 这是剧本。 这是Html

  • 问题内容: 我有一些文件: 如何按地区过滤/选择不同的文档? 在SQL中,我可以使用GROUP BY。我尝试了条件聚合,但返回的计数却不同。 感谢您的帮助!:-) 问题答案: 如果您的ElasticSearch版本为1.3或更高版本,则可以使用top_hits类型的子聚合,默认情况下,它将为您提供按查询分数排序的前三个匹配文档(此处为1,因为您使用match_all查询)。 您可以将参数设置为3以

  • 我是新来的mongo。我有以下收藏。 文件: 请求: 文档集合中的typeId是文档类型的id,其中请求中的typeId是也可以为空的外部字段。如何获得以下输出。