使用 unix 时间戳查询 MongoDB 中的空闲时间段
Query free timeslots in MongoDB using unix timestamps
我是 MongoDB 的新手,这可能是一个常见的用例,但我没有找到这个特定案例的答案。
我想过滤掉那些 MongoDB 文档,其中预订的时间段仍然是免费的,这样就不会与现有预订重叠。
我的 collection 个条目:
{
"_id": "5efc9f89749c983ffd58c55f",
"training": "football",
"bookings": [
{
"from": 1593607419,
"to": 1593622800
}
]
},
{
"_id": "5efc9f89749c983ffd58c55f",
"training": "baseball",
"bookings": [
{
"from": 1593607419,
"to": 1593622800
},
{
"from": 1593687419,
"to": 1593722800
}
]
}
输入“发件人:1593500000”和“收件人:1593600000”的预期结果。
{
"_id": "5efc9f89749c983ffd58c55f",
"training": "football"
},
{
"_id": "5efc9f89749c983ffd58c55f",
"training": "baseball"
}
两个文档都有空闲时间段(不与现有预订重叠)。
输入“发件人:1593670000”和“收件人:1593690000”的预期结果。
{
"_id": "5efc9f89749c983ffd58c55f",
"training": "football"
}
只返回football,因为查询的值与baseball的第二个预订条目重叠。
是否可以通过单个查询完成此操作?例如使用 between 或类似的东西?
或者有更好的approach/best做法吗?
我使用 Spring Data REST 实现了查询,但只要对 mongodb 查询提供一些帮助就已经很有帮助了。
这更像是一个逻辑问题,我对Spring数据不熟悉,你的查询应该是这样的。
{
bookings: {
$not: {
$elemMatch: {
$or: [{
from: { $gte: start, $lte: end }
}, {
to: { $gte: start, $lte: end }
}]
}
}
}
}
我是 MongoDB 的新手,这可能是一个常见的用例,但我没有找到这个特定案例的答案。
我想过滤掉那些 MongoDB 文档,其中预订的时间段仍然是免费的,这样就不会与现有预订重叠。
我的 collection 个条目:
{
"_id": "5efc9f89749c983ffd58c55f",
"training": "football",
"bookings": [
{
"from": 1593607419,
"to": 1593622800
}
]
},
{
"_id": "5efc9f89749c983ffd58c55f",
"training": "baseball",
"bookings": [
{
"from": 1593607419,
"to": 1593622800
},
{
"from": 1593687419,
"to": 1593722800
}
]
}
输入“发件人:1593500000”和“收件人:1593600000”的预期结果。
{
"_id": "5efc9f89749c983ffd58c55f",
"training": "football"
},
{
"_id": "5efc9f89749c983ffd58c55f",
"training": "baseball"
}
两个文档都有空闲时间段(不与现有预订重叠)。
输入“发件人:1593670000”和“收件人:1593690000”的预期结果。
{
"_id": "5efc9f89749c983ffd58c55f",
"training": "football"
}
只返回football,因为查询的值与baseball的第二个预订条目重叠。
是否可以通过单个查询完成此操作?例如使用 between 或类似的东西? 或者有更好的approach/best做法吗?
我使用 Spring Data REST 实现了查询,但只要对 mongodb 查询提供一些帮助就已经很有帮助了。
这更像是一个逻辑问题,我对Spring数据不熟悉,你的查询应该是这样的。
{
bookings: {
$not: {
$elemMatch: {
$or: [{
from: { $gte: start, $lte: end }
}, {
to: { $gte: start, $lte: end }
}]
}
}
}
}