在MongoDB中搜索具有特定月份和年份的JSON文档

a9wyjsp7  于 11个月前  发布在  Go
关注(0)|答案(2)|浏览(177)

我试图从我的MongoDB示例中的集合中检索一些文档。这里是整个集合:

[
  {
    _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月应该返回前两个文档)。我不知道如何在查询中使用两个不同的表达式。
谁能帮我解决这个问题?
感谢您的耐心等待。

ldfqzlk8

ldfqzlk81#

用最简单的话来说,

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

字符串
playground
或者,如果你想要更花哨的,你可以用这样的东西与日期字符串格式(需要mongo 7使用%B和获得月份名称)

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


这在mongoplayground中不起作用,因为它运行在较低的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

fhg3lkii

fhg3lkii2#

您可以修改的一个简单方法是利用$gt$gte$lt$lte比较运算符来指定开始和结束日期,以缩小查询范围。下面我们有大于或等于2020年9月1日但小于2020年10月1日:

db.collection("expenses").find({
   'users.username': 'desired_username',
   'date': {
      $gte: ISODate("2020-09-01"), 
      $lt: ISODate("2020-10-01")
   }
});

字符串

相关问题