【发布时间】:2017-07-05 12:05:37
【问题描述】:
假设我有一个名为“rooms”的集合,其中包含 20 个文档,每个文档在“room_record”字段中都有一个“start_date”和“end_date”,现在我想在 room_record 字段中插入一条新记录,但我希望检查新记录的开始日期和结束日期是否在现有记录 start_date 和 end_date 之间,如果重叠,则查询必须失败或不插入新记录,否则插入新记录。我在这里发现了一个类似的问题 Query and Insert with a single command 但是我无法通过尝试他们的方法来解决我的问题。
这就是我目前所拥有的
房间集合文件
{
"_id" : "0JikW3",
"room_capacity" : "2",
"room_description" : "bla bla bla",
"room_image" : [
"http://i.imgur.com/n99LkGg.jpg",
"http://i.imgur.com/zLPNy83.jpg"
],
"room_price" : "250",
"room_record" : {
"end_date" : "2014-08-18T13:54:52.891Z",
"start_date" : "2014-08-16T13:54:52.891Z"
},
"room_status" : "0",
"room_type" : "A"
}
这是我的方法
//build a record with new start and end date
var room_record = {
"booking_id":bookingID,
"start_date":data.startDate,
"end_date":endDate
}
rooms.update(
{"room_record":{"$elemMatch":{"room_record.start_date":{"$lt":data.startDate},"room_record.end_date":{"$gt":endDate}},"room_type":data.roomType}},
{ $setOnInsert:{"room_record":room_record}},
{upsert:1},
function(err,result){
if (err) return callback(err, null);
callback(err, result);
console.log(result)
})
执行我的方法后,这是我在房间集合中得到的,而不是插入到现有文档中,而是创建了一个新文档。
{
"_id" : ObjectId("53ef765974574412ef7d0a49"),
"room_record" : {
"end_date" : ISODate("2014-08-21T13:54:52.891Z"),
"start_date" : "2014-08-19T13:54:52.891Z"
}
}
这是我预期的结果
{
"_id" : "0JikW3",
"room_capacity" : "2",
"room_description" : "bla bla bla",
"room_image" : [
"http://i.imgur.com/n99LkGg.jpg",
"http://i.imgur.com/zLPNy83.jpg"
],
"room_price" : "250",
"room_record" : [{
"end_date" : "2014-08-18T13:54:52.891Z",
"start_date" : "2014-08-16T13:54:52.891Z"
},{
"end_date" : ISODate("2014-08-21T13:54:52.891Z"),
"start_date" : "2014-08-19T13:54:52.891Z"
}],
"room_status" : "0",
"room_type" : "A"
}
感谢您的帮助,谢谢!
【问题讨论】: