1

私はmongodbを初めて使用します。sale_dateのデータベースがあり、値はテキストとして保存され、形式は「dd:mm:yyyy」です。ここで、日付に基づいてクエリを実行したいと思います。先月のエントリを照会したいのと同じように。フィールド sale_time もあり、テキストとして保存され、形式は「hh:mm」で、過去 1 時間のエントリを照会したいと考えています。

**Java と mongo コンソールからクエリを実行したい。

私のコレクションの1行:

    {  
       "_id":112350,
       "sale_date":"21.07.2011",
       "sale_time":"18:50",
       "store_id":"OK3889-45",
       "region_code":45,
       "product_id":"QKDGLHX5061",
       "product_catagorie":53,
       "no_of_product":1,
       "price":1211.37,
       "total_price":1211.37
    }

何百万ものエントリがあります。ここで、2011 年 7 月のエントリ、または 2013 年 7 月 21 日の 18:00 から 19:00 までの時間のエントリを検索したいと考えています。

4

2 に答える 2

2

結果に一致する正規表現を使用してクエリを実行できます。あなたはフォーマットと言いましdd:mm:yyyyたが、例は次のように見えるdd.mm.yyyyので、例でそれを使用しました

例えば:

db.sales.find({sale_date: /..\.07\.2011/})

インデックスを使用できないため、これは非効率的ですが、仕事は完了します。

日付を文字列として使用して順序を逆にするyyyy:mm:dd場合は、次のようなインデックスにヒットするアンカー正規表現を使用できます。

db.sales.find({sale_date: /2011\.07/})

時間クエリの場合:

db.sales.find({sale_date: "21.07.2013", sale_time: {$gte: "18:00", $lt: "19:00"}})
于 2013-08-15T17:36:23.603 に答える
0

使用した日付構造を考慮して、必要な日付範囲を照会する効率的で信頼できる方法はありません。たとえば、正規表現スタイルのクエリはコレクション全体をスキャンしますが、何百万ものドキュメントがある場合、それは受け入れられません。

理論的には、MapReduce を作成して、データをより適切に構造化して新しいコレクションにすることができます。ただし、それは維持するためのより多くの作業になります (MapReduces は自動的に更新されず、他のクエリやデータ フェッチに必要以上の手順が必要になる可能性があるため)。

ただし、それを希望する場合は、代わりに、コメントで述べたようにデータを標準の YYYYMMDD に修正することを強くお勧めします。さらに良いことに、時間をマージすることを検討し、同じフィールドにタイムスタンプを含めることをお勧めします。

2013-07-21T14:30

そうでない場合でも、単一の日付クエリを合理的に実行できます (ただし、日付と時刻の両方を複合インデックスとしてインデックス付けする必要があります)。

db.sales.ensureIndex({ sale_date: 1, sale_time: 1})

コードに関しては、基本的に次のようになります。

BasicDBObject date = new BasicDBObject("sale_date", "21.07.2013");
BasicDBObject time = new BasicDBObject("sale_time", 
                               new BasicDBObject("$gte", "18:00").
                                           append("$lte", "19:00")); 
BasicDBObject andQuery = new BasicDBObject();
List<BasicDBObject> obj = new ArrayList<BasicDBObject>();
obj.add(date);
obj.add(time);
andQuery.put("$and", obj);

cursor = coll.find(andQuery);
于 2013-08-15T17:57:39.167 に答える