集計を行っています。$lookup
を使用して別のコレクションからデータを取得し、$filter
を使用して新しいデータをフィルタします。
[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
)
)
)
)
は、今私は予約をフィルタリングする:(私は別のデータベースから取得したデータであることreservations
)私の出力は次のようになり、新たなデータを取得した後
。私はreqStartTime
という変数とreqEndTime
という変数を持っています。それらは新しく予約された予約のunixtimesです。これらの値のいずれかが現在の予約のstartUTime
とendUTime
の間にあるかどうかをチェックしたいと思います。
のはreqStartTime
は1496761600とreqEndTime
あるとしましょう、プロジェクト段階で$filter
を使用して1496764200.
です:
{
'$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'の"空の "結果は望ましくないでしょうか?つまり、重複はありませんでした。 –
@ NeeLunn私は本当に 'オーバーラップ'を探しています - 何もない場合は、空の配列を取得しようとしている場合は、重複予約を取得します。 しかし、私がこれを使って試したデータは、常に重複する必要がある場合でも空の配列になります。 –
私が言ったのと同じように、「あなたは私たちに何かデータを教えてもらえますか?」*これは結果を確実にテストできるケースになります。 –