2017-09-16 2 views
0

現在の時刻が文書の開始時刻と終了時刻の間にあるすべての文書を検索しようとしています。私は時と分に異なるフィールドを設定しました。 マイスキーマstarthourとstartminuteが文書の開始時刻と終了時刻の間にあるすべての文書を検索

const mySchema = new Schema({ 
    startHour: { type: Number}, 
    endHour: { type: Number}, 
    startMinute: { type: Number}, 
    endMinute: { type: Number} 
}) 

私が働いていない検索クエリの下に書かれています。ここでは時間値と分の値は、HTTPクエリから来ている私は(もし

find({ 
    $and : [ 
       { $or: [{starthour : { $lt: hour}}, 
        { $and : [ {starthour: { $eq : hour}}, {startMinute: { $gt: minute}}]} 
       ]}, 
       { $or: [{endHour : { $gt: nsh}}, 
        { $and : [ {endhour: { $eq : hour}}, {endMinute: { $gt: minute}}]} 
       ]}, 
      ], 
     }) 

これは、または(時間がstarthourとendhourよりもより大きく、小さい)すべての文書を返す必要があり、クエリで使用する前にintにそれらを変換しましたstarthourまたはendhourはstartminuteがminuteより大きい必要がある時間よりも時間が等しい)。

+0

人生を楽にして、「開始日」と「終了日」を「日の分」から簡単に表現してみましょう。各時間は60分ですので、午前8時から午後5時までは「開始:480、終了:1020」となります。そして、あなたは「現在の議事録」をクエリーに表現して、それがドキュメントの範囲内にあるかどうかを確認します。時間と分を別々のフィールドでじゃまにするよりもずっと簡単です。また、ストレージの使用量も大幅に削減されています。 –

+0

これは良い選択です。ありがとう!! –

答えて

0

ここのロジックは次のとおりです。

  1. は時間が真の isMinMatchを設定していない場合には、endHourに等しいかどうかであるあなたを確認してください。
  2. 等しくなければ、分がendMinuteより大きくないことを確認してください。
  3. 次に、開始時間と終了時間の間に時間があり、isMinMatchがtrueであることを確認します。
  4. 結果からisMinMatchを削除します。

私はこれを達成するためにmongo集約を使用しています。

var hour = 11; 
var minute = 0; 
db.getCollection('testHours').aggregate([ 
{ $addFields: { 
    isMinMatch : { 
     $cond : [{ $eq : [ "$endHour", hour ] } , { $gte : [ "$endMinute" , minute] }, true ] 
    } 
    } 
}, 
{$match: {startHour : { $lte: hour}, endHour : { $gte: hour}, isMinMatch: true } }, 
{ $project : { isMinMatch: 0 } } 
]) 
+0

は、時間の時の値が19で、分が25で、開始時間が15:00で、終了時間が20:00とすることができます。この場合、最後の条件{endMinute:{$ gte:minute}は失敗します。それで私はLTとEQの状態を別々にチェックしています。 –

+0

私の答えが更新されました。もう一度確認してください。 –

関連する問題