2017-09-25 14 views
0

私はmongo dbを持っていて、mongooseを使用しています。日付間の最大のギャップを見つけることは可能ですか?私が持っているのであれば:mongoose:日付エントリの最大の時差を見つけよう

LastUpdate: 2017-09-25 12:30:41.814Z 
LastUpdate: 2017-09-25 12:31:41.814Z 
LastUpdate: 2017-09-25 12:35:41.814Z 
LastUpdate: 2017-09-25 12:36:41.814Z 
LastUpdate: 2017-09-25 12:37:41.814Z 
LastUpdate: 2017-09-25 12:39:41.814Z 

をそれは返します:

LastUpdate: 2017-09-25 12:31:41.814Z 
LastUpdate: 2017-09-25 12:35:41.814Z 

またはより良い、日付の間の中間点:

LastUpdate: 2017-09-25 12:33:41.814Z 

を私はすべてのいくつかのコードを実行するアプリを持っていますしばしば。私は可能な限りお互いに遠く離れて走るように、リクエストを(毎日各ユーザーのために)実行したいと思っています。私は完全にこの問題を間違った方法で見ているかもしれません。あなたがより良い解決策を持っているなら、私に教えてください。

+0

確かに可能です。 LastUpdateによって注文されたすべてのレコードを取得し、結果を反復してギャップを計算します。私のフォールバック計画だったが、私は、私は私にいくつかの処理時間を節約するために行うことができ、いくつかの空想の問合せがあった期待していた –

+0

@AlexBlex。 –

+0

私はどのようにしてそれを行うことができるかの例を投稿しましたが、あなたには何も保存されません。パイプラインのコメントを参照してください。 –

答えて

0

それは、以下の「空想クエリ」で、そうすることは可能ですが、私は「ある程度の処理時間を節約する」ために、アプリケーションレベルでのギャップを計算することをお勧めしたいです。

db.collection.aggregate([ 
    { $sort: {LastUpdate: 1} }, 
    // doubles the dataset 
    { $facet: { 
     "first": [{ $match: {LastUpdate:{$exists: true}}}], 
     "second": [{ $match: {LastUpdate:{$exists: true}}}] 
    }}, 
    // squares it 
    { $unwind: { 
     path: "$second", 
     includeArrayIndex: "_num" 
    }}, 
    { $match: { _num : {$gt: 0}}}, 
    // returns back to the doubled size 
    { $project: { first: { $arrayElemAt: [ "$first", {$subtract: ["$_num", 1 ]}] }, second: 1}}, 
    // calculates the gap 
    { $project: { 
     first: 1, 
     second: 1, 
     gap: { $subtract: [ "$second.LastUpdate", "$first.LastUpdate" ] } 
    }}, 
    { $sort: {gap: -1}}, 
    { $limit: 1} 
]) 
関連する問題