【问题标题】:MongoDB: how to query based on date interval and one more condition that match all the date in intervalMongoDB:如何根据日期间隔和一个匹配间隔中所有日期的另一个条件进行查询
【发布时间】:2019-04-21 03:09:37
【问题描述】:

我有一个 mongo 集合,它存储有关产品的信息,它有一个嵌入式数组,可以按日期存储其可用性。

{
  "product_id": "A",
  "name": "mountain bicycle",
  "cost_per_hour": "$5",
  "availability":[
    {
      "timestamp": ISODate("2018-11-19 18:30:00.000Z"),
      "available": true
    },
    {
      "timestamp": ISODate("2018-12-20 18:30:00.000Z")
      "available": true
    },
    {
      "timestamp": ISODate("2018-12-21 18:30:00.000Z")
      "available": false
    }
  ]
}

我想列出给定日期间隔内所有日期可用的所有产品。

示例:如果我查询 ISODate("2018-11-19 18:30:00.000Z") 到 ISODate("2018-12-20 18:30:00.000Z") AND available: true, I应该得到一个带有“product_id”的产品:“A”,因为它在日期间隔之间的所有日期都可用。

但是如果我在 ISODate("2018-11-19 18:30:00.000Z") 到 ISODate("2018-12-21 18:30:00.000Z") 和可用之间查询:真,我不应该得到任何结果,因为该产品并非在日期范围内的所有日期都可用。

我尝试使用 $elemMatch,但它返回的产品至少有 1 个在间隔中给定的日期可用,这是我不想要的。

请指导。

【问题讨论】:

  • 我不认为它是重复的。您提到的帖子讨论了投影,而我的帖子处理在多个条件下查询嵌入式 mongo 数组并返回与所有条件匹配的文档。

标签: mongodb mongodb-query


【解决方案1】:

要查找数组字段的所有元素通过查询的文档,您可以反转查询以查找失败案例 (available: false),然后使用 $not 仅返回没有发生该故障案例的文档:

db.test.find({
  availability: {$not: {$elemMatch: {
    timestamp: {$gte: ISODate("2018-11-19 18:30:00.000Z"), 
                $lte: ISODate("2018-12-21 18:30:00.000Z")},
    available: false
  }}}
})

【讨论】:

  • 谢谢@JohnnyHK。我们如何为顶级文档(即不属于数组的文档)进行反转?
【解决方案2】:

遵循以下文档:

https://docs.mongodb.com/manual/tutorial/query-array-of-documents/

在:

db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )

你正在寻找的是这样的:

db.StoreCollection.find( { 
         "availability": { 
              "timestamp": ISODate("2018-12-20 18:30:00.000Z")
              "available": true
          }
 })

【讨论】:

  • 继续阅读那里的文档并学习一些东西。 Specify Multiple Conditions for Array of Documents。你在这里的查询是完全错误的。你似乎也误读了这个问题。
  • 是的,我之前读过文档。您建议的上述查询仅在查询中给出的文档与您正在查询的集合中存在的文档结构和顺序完全匹配时才有效。这不是我想要的结果。我仅基于 2 个字段时间戳和可用字段进行查询。
猜你喜欢
  • 2019-04-21
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
相关资源
最近更新 更多