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

时间:2018-11-18 16:32:19

标签: 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
    },
    {
      "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,但返回的产品在间隔中给定日期的至少日期中是我不希望的。

请指导。

2 个答案:

答案 0 :(得分:1)

要查找数组字段的 all 个通过查询的文档,可以反转查询以查找失败情况(available: false),然后使用{{3} }仅返回没有发生这种故障情况的文档:

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

答案 1 :(得分:0)

参考以下文档:

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