MongoDB:如何根据日期间隔和一个以上匹配间隔中所有日期的条件进行查询

MongoDB:如何根据日期间隔和一个以上匹配间隔中所有日期的条件进行查询,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个mongo集合,它存储有关产品的信息&它有一个嵌入式阵列,可按日期存储其可用性 { "product_id": "A", "name": "mountain bicycle", "cost_per_hour": "$5", "availability":[ { "timestamp": ISODate("2018-11-19 18:30:00.000Z"), "available": true }, { "tim

我有一个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”)之间的日期和可用日期:true,我应该得到一个具有“product_id”:“a”的产品,因为它在日期间隔之间的所有日期都可用

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

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

请指导。

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

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
  }}}
})

以下是关于以下方面的文件:

地址:

您正在寻找的是:

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

我认为它不是复制品。你提到的那篇文章谈到了投影,我的文章讨论了在多个条件下查询嵌入式mongo数组并返回匹配所有条件的文档。继续阅读那里的文档并学习一些东西。你在这里的疑问是完全错误的。你似乎也误读了这个问题。是的,我以前看过文件。您建议的上述查询只有在查询中提供的文档与您正在查询的集合中的文档结构和顺序完全匹配时才起作用。这不是我预期的结果。我只根据2个字段时间戳和可用字段进行查询。谢谢@johnyhk。对于顶级文档(即不属于数组的文档),我们如何进行反转?
db.StoreCollection.find( { 
         "availability": { 
              "timestamp": ISODate("2018-12-20 18:30:00.000Z")
              "available": true
          }
 })