2017-06-06 3 views
1

集計を行っています。$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です。これらの値のいずれかが現在の予約のstartUTimeendUTimeの間にあるかどうかをチェックしたいと思います。

のは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" ] } 
          ]}  
         ]} 
       } 
      } 
     } 
    } 

問題があり、これはすべての予約をフィルタリング - 出力は常に空の配列です。私は変数reqStartTimereqEndTimeを手作業で設定してテストしましたが、範囲内であることを確認しました。

+0

'$ lookup'によって配列エントリの状態を示すことができ、条件をテストするデータがあった場合、より良いでしょう。あなたは "重複"を探していますか?どちらの場合ですか?提供されたパラメータが「重複している」か、「重複しない」ところはどこですか?後者の場合、おそらく "予約時間"は大丈夫であり、 '$ filter'の"空の "結果は望ましくないでしょうか?つまり、重複はありませんでした。 –

+0

@ NeeLunn私は本当に 'オーバーラップ'を探しています - 何もない場合は、空の配列を取得しようとしている場合は、重複予約を取得します。 しかし、私がこれを使って試したデータは、常に重複する必要がある場合でも空の配列になります。 –

+0

私が言ったのと同じように、「あなたは私たちに何かデータを教えてもらえますか?」*これは結果を確実にテストできるケースになります。 –

答えて

0

クエリが有効なものであることが判明しました。問題は、変数が文字列に変換されたことでした。それらを整数に変換することで問題は解決されました。

関連する問題