2

変数と比較したときに 2 つのフィールド間の結果が一致するドキュメントを mongo にクエリする方法を探しています。

たとえば、日付範囲が重複しています。次のスキーマを持つドキュメントがあります。

{startDate : someDate, endDate : otherDate, restrictions : {daysBefore : 5, daysAfter : 5}}

私のユーザーは、次のような独自の日付範囲を提供します

var userInfo = { from : Date,  to : Date}

この条件を満たす書類が必要です:

startDate - restrictions.daysBefore <= userInfo.to && endDate + restrictions.daysAfter >= userInfo.from;

句を使用しようとしましたが、 and$whereのコンテキストが失われました。それらは where 関数のスコープ外で定義されているためです。tofrom

すべての結果をプルダウンしたり、挿入時に別のフィールドを作成したりせずに、これを行いたいと思います。

このクエリを実行できる簡単な方法はありますか?

4

1 に答える 1

2

集約フレームワーク [AF] は、あなたが望むことを行います。AF バックエンドは C++ で記述されているため、追加のボーナスとして JavaScript を使用するよりもはるかに高速です。JavaScript よりも高速であることに加えて、$where の使用をお勧めしない理由がいくつかあります。その一部は $where ドキュメントに記載されています。AF ドキュメント (つまり、使用するのに適したもの): http://docs.mongodb.org/manual/reference/aggregation/ 保存しているデータの形式が不明であり、これもパフォーマンスに影響します。たとえば、日付が 1970 年 1 月 1 日 (UNIX エポック) からのミリ秒単位の標準日付であり、daysBefore が (1 日あたりのミリ秒数) * (日数) で格納されている場合、以下の例のように簡単な計算を使用できます。これは非常に高速です。そうでない場合は、AF で利用可能な日付変換がありますが、もちろん、違いを取得するだけでなく、変換を行うにはより多くのコストがかかります。

Python (プロファイルで Django に言及) では、datetime.timedelta を daysBefore に使用できます。たとえば、5 日間: import datetime daysBefore=datetime.timedelta(5)

AF で何を使用するかについては、主に 2 つの方法があります。直接計算して照合するか、新しい列を作成してそれと照合します。複雑な展開や大規模な展開では、特定のユース ケースとテストが必要になります。Python での計算と照合するためのシェルからの集計コマンド:

fromDate=<program provided>
db.collection.aggregate([{"$match":{"startDate":{ "$lt": {"$add": ["$restrictions.daysBefore", fromDate]}}}}])

同じ $match で複数の計算を実行する場合は、$and:[{}, {}, …, {}] を使用します。わかりやすくするために省略しました。AF の詳細な集計ドキュメントは、http: //api.mongodb.org/python/current/examples/aggregation.html#aggregation-frameworkにあります。

「集約」には Mongo の map reduce も含まれますが、この場合、AF はそれをすべて (そしてはるかに迅速に) 実行できるはずです。

AF についてさらに詳しい情報が必要な場合、またはドキュメントで不明な点がある場合は、お気軽にお問い合わせください。

ベスト、チャーリー

于 2013-09-18T16:09:32.070 に答える