2017-04-07 5 views
1

病院の患者のためにスケジュールされた仕事を作成したい。患者は毎月reg_dateで通知されます。マングース:スケジュールされたジョブクエリを日付別に実行する

私はスケジュールされた仕事の中で、患者にSMSを送信するために朝の午前8時に実行するためにnew Date().getDate()を使用しています。その間、私はreg_dateをmongoDBに保存するために文字列形式の日付を使用していました。ここに私のMongoDBのドキュメントの抜粋です:

{ 
    customer: "John", 
    reg_date: "2017-02-17T16:39:26.969Z" 
} 

私はベンのソリューションのためのサーフィンをしましたが、それは何も判明していないので、私は自分自身を投稿することを決めました。ここで私がやろうとしていますされているもの:

customer.find({"reg_date.getDate()" : new Date(2017, 03, 17).getDate()}) 
    .then(function(data) { 
     for (var key in data.length) { 
      sendTheSMS(key[data]); 
     }; 
    }); 

例えば:私は何をやっていることは、「私は、月の17日目で登録し、それらにSMSを送信するすべての患者を取得したい」です。

ご協力いただければ幸いです。 :D

答えて

1

を使用してください。

$projectこれはフィールドをプロジェクトするのに役立ちます。ここにはreg_dateという日付の新しい一時フィールドdayが作成されます。次に、新しいフィールドの日を使用してクエリを実行し、結果を取得します。

このテンポラリフィールドdayは、スキーマやモデルには追加されません。これは、SQLのように作成する一時ビューと同じです。

ここで私は顧客と昼間のみを投影しましたが、結果に必要なすべてのフィールドを投影してください。この

[{ 
"_id" : ObjectId("571f2da8ca97eb10163e6e17"), 
"customer" : "John", 
"reg_date" : ISODate("2016-04-17T08:58:16.414Z"), 
"day" : 17 
}, 
{ 
"_id" : ObjectId("571f2da8ca97eb10163e6e17"), 
"customer" : "Prasanth", 
"reg_date" : ISODate("2016-04-17T08:58:16.414Z"), 
"day" : 17 
}] 

があなたのプロセスの中に投影dayフィールドを無視するように

function getCustomerList(day, callback){ 
    customer.aggregate([ 
     { 
     $project:{ 
      "customer": "$customer", //repeat the same for all field you want in result 
      "reg_date": "$reg_date", 
      "day":{$dayOfMonth:"$reg_date"} //put day of month in 'day' 
     } 
     }, 
     { 
     $match:{ 
      "day": day //now match the day with the incoming day value 
     } 
    }, 
    ], function(err, result){ 
     callback(err, result);    
    }) 
} 

getCustomerList(17, function(err, result){ // call the function like this with date you want 
    // Process the err & result here 
}); 

結果は、あなたがそれだけのように、月の日を照会することができない文字列にreg_date

+0

ありがとうございました。しかし、何ヶ月も年にもかかわらず、私が17歳になったら、ジョンが再び登場したい。私はその質問を受け取ることはできません。 :) –

+0

mongodbのどのバージョンがインストールされていますか? –

+0

MongoDBシェルのバージョン:3.2.11 –

0

を使用すると、集計方法の代わりに、通常のFindメソッドを使用する必要がありますビット複雑なクエリのこのタイプのより大きく、より少ない

var previousDate =new Date(2017, 1, 16); //month starts with 0 
var nextDate=new Date(2017, 1, 18); 

customer.find({reg_date : { $gt:previousDate,$lt:nextDate}}) 
.then(function(data) { 
    for (var key in data.length) { 
    sendTheSMS(key[data]); 
    }; 
}); 
+0

ありがとうございます。しかし、何ヶ月も年にもかかわらず、私が17歳になったら、ジョンが再び登場したい。私はその質問を受け取ることはできません。 :) –

1

...となりますISODateで動作します。最初に、すべての文書の中の文字列をスクリプトでreg_dateに変換することをお勧めします。

その後、次のクエリはreg_dateので

customer.aggregate([ 
{ 
    $project:{ 
      "document": "$$ROOT", //to get the whole document 
      "day":{$dayOfMonth:"$date"} //put day of month in 'day' 
      } 
    }, 
{ 
    $match:{ 
     "day": 17 //match 17 
     } 
    }, 

], function(data) { 
    for (var key in data.length) { 
     sendTheSMS(key[data]); 
    }; 
}) 
+0

こんにちはタルハ、あなたの答えは私に有望そうです。私はまだmongoDBとmongoose ODMで新しいです。 '$ project'セクションを詳しく教えてください。乾杯。 –

+0

これは集約パイプラインで使用されます。正式な定義は参考になります: "[project](https://docs.mongodb.com/manual/reference/operator/aggregation/project/#pipe._S_project)要求されたフィールドを持つドキュメントに沿って、パイプライン " –

0

を動作するはずですが、文字列ではなく、日付/ ISODateとして格納されている、あなたは、あなたが実行できるクエリの種類に関して制限している(私はに同意他の回答の1つにコメントを入れて、適切なISODateに変換することを検討してください)。動的

customer.find({ reg_date : /-17T/ }) 

または、::

let today = new Date(); 
let dom = ('00' + today.getDate()).slice(-2); // zero-pad day of month 
let re = new RegExp('-' + dom + 'T'); 

customer.find({ reg_date : re }) 

あなたに

あなたが特定の日のヶ月、あなたが使用することができますregular expressionクエリでエントリの日付文字列を照会することを考慮すると、速度の最適化に関してはthisも読んでください。でも、正規表現のクエリはそれほど高速ではありません。

関連する問題