Mongodb 如何查询日期范围之间的对象

Mongodb 如何查询日期范围之间的对象,mongodb,mongodb-query,mongojs,Mongodb,Mongodb Query,Mongojs,我在mongodb集合中有如下文档: "listingReservation" : { "reservationFromDate" : new Date("14.1.2015 00:00:00"), "reservationToDate" : new Date("17.1.2015 00:00:00"), "reservationCreatedBy" : "test@test.com", "reservationCreatedOn" : "", "res

我在mongodb集合中有如下文档:

 "listingReservation" : {
    "reservationFromDate" : new Date("14.1.2015 00:00:00"),
    "reservationToDate" : new Date("17.1.2015 00:00:00"),
    "reservationCreatedBy" : "test@test.com",
    "reservationCreatedOn" : "",
    "reservationChangedBy" : "",
    "reservationChangedOn" : "",
    "reservationStatus" : "pending"  //status can be pedning, accepted or rejected  
  }
现在,当管理员接受预订时,相同日期范围内的其他预订和包含已接受预订的预订应设置为拒绝状态

现在,我如何确定在新预订日期之间是否已经存在预订对象,或者是否已经存在针对新预订日期的包含预订

我尝试了下面的查询,但显然所有条件都不起作用

db1.reservationTable.update(
            {
                $and: [{
                    $or: [{

                        $or: [
                            {
                                'listingReservation.reservationFromDate': {
                                    $gte: new Date(req.body.listingReservation.reservationFromDate),
                                    $lt: new Date(req.body.listingReservation.reservationToDate)
                                }
                            },
                            {
                                'listingReservation.reservationToDate': {
                                    $gte: new Date(req.body.listingReservation.reservationFromDate),
                                    $lt: new Date(req.body.listingReservation.reservationToDate)
                                }
                            }
                        ],
                        $and: [
                            {'listingReservation.reservationFromDate': {$lte: new Date(req.body.listingReservation.reservationFromDate)}},
                            {'listingReservation.reservationToDate': {$gte: new Date(req.body.listingReservation.reservationToDate)}}
                        ]
                    }]
                },
                    {'listingBasics.listingId': req.body.listingBasics.listingId},
                    {_id: {$ne: mongojs.ObjectId(req.body._id)}},
                    {'listingBasics.listingOwner': req.user.username}
                ]
            },
            {
                $set: {'listingReservation.reservationStatus': 'rejected'}
            })

合乎逻辑的问题是

是否有以下预订:

开始日期在请求正文ListingServation.reservationFromDate之前,结束日期在请求正文ListingServation.reservationFromDate之后

开始日期在请求正文ListingServation.reservationToDate之前,结束日期在请求正文ListingServation.reservationToDate之后

开始日期在请求正文ListingServation.reservationFromDate之后,结束日期在请求正文ListingServation.reservationToDate之前

以下是基于您的查询的可能查询:

db1.reservationTable.update(
  {
    $or: [
      {
        'listingReservation.reservationFromDate': {
          $lte: new Date(req.body.listingReservation.reservationFromDate)
        }, 'listingReservation.reservationToDate': {
          $gte: new Date(req.body.listingReservation.reservationFromDate)
        }
      }, {
        'listingReservation.reservationFromDate': {
          $lte: new Date(req.body.listingReservation.reservationToDate)
        }, 'listingReservation.reservationToDate': {
          $gte: new Date(req.body.listingReservation.reservationToDate)
        }
      }, {
        'listingReservation.reservationFromDate': {
          $gte: new Date(req.body.listingReservation.reservationFromDate)
        }, 'listingReservation.reservationToDate': {
          $lte: new Date(req.body.listingReservation.reservationToDate)
        }
      }
    ],
    'listingBasics.listingId': req.body.listingBasics.listingId,
    _id: {$ne: mongojs.ObjectId(req.body._id)},
    'listingBasics.listingOwner': req.user.username
  }, {
    $set: {'listingReservation.reservationStatus': 'rejected'}
  })

合乎逻辑的问题是

是否有以下预订:

开始日期在请求正文ListingServation.reservationFromDate之前,结束日期在请求正文ListingServation.reservationFromDate之后

开始日期在请求正文ListingServation.reservationToDate之前,结束日期在请求正文ListingServation.reservationToDate之后

开始日期在请求正文ListingServation.reservationFromDate之后,结束日期在请求正文ListingServation.reservationToDate之前

以下是基于您的查询的可能查询:

db1.reservationTable.update(
  {
    $or: [
      {
        'listingReservation.reservationFromDate': {
          $lte: new Date(req.body.listingReservation.reservationFromDate)
        }, 'listingReservation.reservationToDate': {
          $gte: new Date(req.body.listingReservation.reservationFromDate)
        }
      }, {
        'listingReservation.reservationFromDate': {
          $lte: new Date(req.body.listingReservation.reservationToDate)
        }, 'listingReservation.reservationToDate': {
          $gte: new Date(req.body.listingReservation.reservationToDate)
        }
      }, {
        'listingReservation.reservationFromDate': {
          $gte: new Date(req.body.listingReservation.reservationFromDate)
        }, 'listingReservation.reservationToDate': {
          $lte: new Date(req.body.listingReservation.reservationToDate)
        }
      }
    ],
    'listingBasics.listingId': req.body.listingBasics.listingId,
    _id: {$ne: mongojs.ObjectId(req.body._id)},
    'listingBasics.listingOwner': req.user.username
  }, {
    $set: {'listingReservation.reservationStatus': 'rejected'}
  })

如果我正确理解了这个问题,那么您正在寻找一个查询,以查找是否有任何预订与日期范围重叠,并将这些预订的状态设置为
已拒绝
。根据您的设置,执行此操作的标准查询是

db1.reservationTable.update({ 
        "reservationFromDate" : { "$lte" : new Date(req.body.listingReservation.reservationToDate) },            
        "reservationToDate" : { "$gte" : new Date(req.body.listingReservation.reservationFromDate) } 
    }, 
    { "$set" : { "reservationStatus" : "rejected" } }, 
    { "multi" : true }
)

如果我们将被测试的时间段称为重叠
T
S
,通俗地说,条件是
T
S
结束之前开始,而
T
S
开始之后结束。如果您仔细想想,您会发现这保证了
T
S
重叠。

如果我正确理解了这个问题,您正在寻找一个查询,以查找是否有任何保留与日期范围重叠,并将这些保留的状态设置为
已拒绝
。根据您的设置,执行此操作的标准查询是

db1.reservationTable.update({ 
        "reservationFromDate" : { "$lte" : new Date(req.body.listingReservation.reservationToDate) },            
        "reservationToDate" : { "$gte" : new Date(req.body.listingReservation.reservationFromDate) } 
    }, 
    { "$set" : { "reservationStatus" : "rejected" } }, 
    { "multi" : true }
)

如果我们将被测试的时间段称为重叠
T
S
,通俗地说,条件是
T
S
结束之前开始,而
T
S
开始之后结束。如果你仔细想想,你会发现这保证了
T
S
的重叠。

谢谢你的回答,但这里有一个条件仍然没有满足,我正在绞尽脑汁去理解这是如何结合在一起的。下面是我测试的场景,我的预订看起来像这样(开始-结束)-(14-17),(18-19),(23-25),&(15-20)。现在接受(14-17)拒绝(18-19)和(15-20)。接受(18-19)拒绝(15-20)这两种情况是正确的。但接受(15-20)只拒绝(14-17),我甚至希望(18-19)被拒绝。这是因为mongodb吗?因为正如我从你的逻辑问题中读到的,所有的条件都应该包括在内你能提供问题中的实际样本数据吗?一个简单的
db1.reservationTable.find()
,其中包含任何已编辑的敏感数据?感谢您的回答,但这里的一个条件仍然不满足,我正在绞尽脑汁想了解如何将其合并。下面是我测试的场景,我的预订看起来像这样(开始-结束)-(14-17),(18-19),(23-25),&(15-20)。现在接受(14-17)拒绝(18-19)和(15-20)。接受(18-19)拒绝(15-20)这两种情况是正确的。但接受(15-20)只拒绝(14-17),我甚至希望(18-19)被拒绝。这是因为mongodb吗?因为正如我从你的逻辑问题中读到的,所有的条件都应该包括在内你能提供问题中的实际样本数据吗?一个简单的
db1.reservationTable.find()
,其中包含任何已编辑的敏感数据?这确实涵盖了所有逻辑基础。我不确定为什么找不到这个简化的查询表单。干得好@谢天谢地,Wdberkeley非常完美,非常优雅。它涵盖了所有的逻辑基础。我不确定为什么找不到这个简化的查询表单。干得好@谢天谢地,Wdberkeley非常完美,非常优雅。