我正在try 从我的MongoDB实例的集合中检索一些文档. 这就是你的全部Collection :

[
  {
    _id: ObjectId("65708c6237b62067296a398f"),
    date: ISODate("2020-09-15T04:07:05.000Z"),
    description: 'playstation',
    category: 'miscellaneous',
    cost: 499,
    users: [ { username: 'Giacomo', amount: 499 } ]
  },
  {
    _id: ObjectId("6570950cecb7eb1b4b868409"),
    date: ISODate("2020-09-15T04:07:05.000Z"),
    description: 'tennis court',
    category: 'sport',
    cost: 100,
    users: [
      { username: 'prova', amount: 50 },
      { username: 'Giacomo', amount: 50 }
    ]
  },
  {
    _id: ObjectId("6570953aecb7eb1b4b86840a"),
    date: ISODate("2023-02-09T03:12:15.012Z"),
    description: 'netflix subscription',
    category: 'entertainment',
    cost: 100,
    users: [ { username: 'prova', amount: 10 } ]
  }
]

目前,我可以使用以下查询检索值为date的某一年的文档:

  db
    .collection("expenses")
    .find({
      "users.username": "desired_username",
      $expr: { $eq: [{ $year: "$date" }, 2020] },
    })

作为下一步,我希望检索不仅具有特定年份而且具有特定月份的文档(例如,2020年9月应返回前两个文档).我不知道如何在查询中使用两个不同的表达式.

有人能帮我解决这个问题吗?

首先感谢您的耐心等待.

推荐答案

用最简单的话说,你可以拥有这样的东西

db.collection("expenses").find({
  "users.username": "desired_username",
  $expr: {
    $and: [
      { $eq: [{ $year: "$date" }, 2020] },
      { $eq: [{ $month: "$date" }, 9] }
    ]
  }
})

playground

或者,如果您想要更多花哨,您可以使用类似于日期到字符串的格式(need mongo 7表示使用%B并获得月份名称)

db.collection("expenses").find({
  "users.username": "desired_username",
  $expr: {
      { $eq: [{ $dateToString: { format: "%B, %Y", date: "$date" } }, "september, 2020"] }  
  }
})

这将不会在MongoPlatform上运行,因为它运行在较低的mongo版本上

或者一些可能在旧版本上运行的东西,如

db.collection("expenses").find({
  "users.username": "Giacomo",
  $expr: {
    $and: [
      { $eq: [{ $year: "$date" }, 2020] },
      {
        $eq: [
          {
            $arrayElemAt: [
              ["", "january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"],
              { $month: "$date" }
            ]
          },
          "september"
        ]
      }
    ]
  }
})

playground

好的,最后一个只是为了好玩,但我想这太多了,使得查询有时很难理解(这正是第二种方法所示的更长的版本)

db.collection("expenses").find({
  "users.username": "Giacomo",
  $expr: {
    $eq: [
      {
        $concat: [
          {
            $arrayElemAt: [
              ["", "january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"],
              { $month: "$date" }
            ]
          },
          ", ",
          { $toString: { $year: "$date" } }
        ]
      },
      "september, 2020"
    ]
  }
})

playground

Json相关问答推荐

从JSON格式提取数据时分隔通用名称

使用Jolt库对多个数组进行嵌套循环

在解码的JSON哈希中搜索数组元素

在ConvertFrom-Json之后需要从PowerShell对象中获取数据

褐煤面积图中的分选问题

如何将响应数据保存到Flutter 中的共享首选项中

jq:将一个数组与多个数组连接起来

使用动态语言jQuery:根据匹配模式提取与其他值匹配的值

jq:用列表包装所有第一级原子值

使用 json 值过滤 Django 模型

在 Flutter 中将对象转换为可编码对象失败

Golang / Go - 如果 struct 没有字段,如何将其编组为空?

缺少所需的请求正文内容:org.springframework.web.method.HandlerMethod$HandlerMethodParameter

IE8 原生 JSON.parse 错误导致堆栈溢出

以 unicode 将 pandas DataFrame 写入 JSON

jquery用json数据填充下拉列表

我应该如何处理 JSON 中的 HATEOAS 链接和引用?

如何使用 Json.NET 反序列化可以是两种不同数据类型的 JSON 属性

Newtonsoft 对象 → 获取 JSON 字符串

添加json文件注释