1
我在做一個聚合,使用$lookup
從另一個集合中獲取數據,然後在項目階段使用$filter
來過濾新數據。
獲得新的數據我的輸出看起來像在此之後(reservations
是我從不同的數據庫中獲取數據):
[0] => stdClass Object
(
[_id] => 592fffe7f509270850281871
[name] => Table 1
[seats] => 4
[reservations] => Array
(
[0] => stdClass Object
(
[_id] => 59367485f5092753f477f2c1
[guests] => 3
[date] => stdClass Object
(
[$date] => 1496768400000
[$unixtime] => 1496768400
[_datetime] => 2017-06-06 17:00:00
)
[dateString] => 2017-06-06
[duration] => 45
[startUTime] => 1496761200
[endUTime] => 1496763900
[tables] => Array
(
[0] => 592fffe7f509270850281871
[1] => 592fffe7f509270850281874
)
[reservedAt] => stdClass Object
(
[$date] => 1496740997000
[$unixtime] => 1496740997
[_datetime] => 2017-06-06 09:23:17
)
)
)
)
現在我要過濾的保留。我有一個名爲reqStartTime
的變量和一個名爲reqEndTime
的變量。這些是新要求預訂的unixtimes。我想檢查這些值中的任何一個是否在當前預留的startUTime
和endUTime
之間。
比方說reqStartTime
是1496761600和reqEndTime
是1496764200.
在項目階段使用$filter
:
{
'$project' : {
name: 1,
seats: 1,
reservations : {
'$filter': {
input : "$reservations",
as: "res",
cond :
{ '$or' : [
{ '$and' : [
{ '$gte' : [ reqStartTime, "$$res.startUTime" ] },
{ '$lte' : [ reqStartTime, "$$res.endUTime" ] }
]},
{ '$and' : [
{ '$gte' : [ reqEndTime, "$$res.startUTime" ] },
{ '$lte' : [ reqEndTime, "$$res.endUTime" ] }
]}
]}
}
}
}
}
的問題是,這會過濾掉所有預訂 - 輸出始終是一個空數組。我已經測試了手動設置變量reqStartTime
和reqEndTime
以確保它們在範圍內,但沒有運氣。
如果你可以顯示'$ lookup'填充的數組條目的狀態,那麼會更好,所以有一些數據要測試條件。你正在尋找「重疊」的權利?這是什麼情況?提供的參數「重疊」還是「不重疊」?在後者,這可能意味着「預訂時間」是好的,並且「$ filter」的「空」結果是不希望的?因此意思是「不重疊」。 –
@NeilLunn我正在尋找'overlapps'的確 - 我試圖在沒有重疊的情況下得到一個空數組,並且如果有任何重疊的保留,就得到重疊的保留。 但是,無論我嘗試使用這些數據,我總是會得到一個空數組(即使應該有重疊)。 –
就像我說的那樣,*「你能告訴我們一些數據嗎?」*然後,這成爲我們可以可靠地測試結果的情況。 –