2013-08-15 2 views
0

나는 mongodb에 새롭다 나는 sales_date를 가진 데이타베이스가 있고 가치는 원본으로 저장되고 체재는 "dd : mm : yyyy"이다. 이제 날짜를 기준으로 쿼리하고 싶습니다. 지난 달의 항목을 쿼리하고 싶습니다. 필자도 sales_time 필드가 있으며 텍스트로도 저장되며 형식은 "hh : mm"이며 마지막 시간 항목을 쿼리하려고합니다.mongoDB에서 잘못된 날짜 형식의 텍스트로 저장된 날짜를 쿼리하는 방법

** java 및 mongo 콘솔에서도 쿼리하고 싶습니다.

{ "_id": 112350, "sale_date": "2011년 7월 21일", "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 월 21 일 18 시부 터 19 시까 지 2011 년 7 월 또는시에 대한 항목을 찾고 싶습니다.

+0

당신은 약간 더 어려운 길을 선택했습니다 날짜를 Y로 처리 yy-mm-dd는 자연스럽게 정렬되므로 문자열로 사용하는 것이 훨씬 쉬울 것입니다. 우리가 도울 수 있도록 당신의 시도를 보여주십시오.나는 지난 시간의 항목으로 당신이 의미하는 것을 분명하지 않습니다. 시간을 기준으로 정렬 할 수 있으며 예를 들어 24 시간 표기법을 사용했다고 가정 할 때 상위 표를 가져올 수 있습니다. – WiredPrairie

+0

@WiredPrairie 질문을 편집했습니다 – Lipu

답변

1

결과에 맞는 정규식으로 쿼리 할 수 ​​있습니다. 당신은 형식 dd:mm:yyyy 말했지만 dd.mm.yyyy 그래서 내가 사용하는 같은 예는 보이는 예 예를 들어

에서 :

이이 인덱스를 사용할 수 없지만는이 작업 수행하기 때문에 ineficient됩니다
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"}}) 
+0

이것이 도움이 되었습니까? – Ben

+0

네, 저에게 도움이되지만 미안 해요 저의 평판이 낮아서 투표를 할 수는 없습니다. – Lipu

+0

앞에서 언급했듯이 (그리고 Ben이 언급했다.) 당신이 당신의 날짜 포맷을 바꾸지 않는다면, 기존 구조체에 정규 표현식을 사용하면 MongoDB는 인덱스를 사용하지 않을 것이고 콜렉션의 모든 문서를 검색 할 것임을 의미한다. – WiredPrairie

0

사용한 날짜 구조가 주어진 날짜 범위를 쿼리하는 데 효율적이고 신뢰할 수있는 방법은 없습니다. regex 스타일의 쿼리는 예를 들어 전체 콜렉션을 스캔 할 것이고, 수백만 개의 문서가 있다면 그것은 받아 들일 수 없다.

이론적으로 MapReduce를 만들어 데이터를 새로운 컬렉션으로보다 잘 구성 할 수 있습니다. 그러나 MapReduces가 자동으로 업데이트되지 않으므로 다른 쿼리 및 데이터 가져 오기에 원하는 단계보다 더 많은 단계가 포함될 수 있으므로 유지 관리가 더 많이 필요합니다.

그래도 기꺼이하신다면 제 의견에 언급 한 데이터를 표준 YYYYMMDD로 수정하시는 것이 좋습니다. 더 나은, 당신은 시간을 병합하는 것이 좋습니다과 같은 분야에서 타임 스탬프를 포함하는 것입니다 :

2013-07-21T14:30 

은 아니지만 경우에, 당신은 여전히 ​​합리적으로 하나의 날짜 쿼리를 수행 할 수 있습니다 (당신이 비록 '인덱스에 복합 인덱스로 날짜와 시간)을 모두 원하는 D :

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); 
+0

답변을 주셔서 감사합니다. 정말 도움이됩니다. 나는 다른 종류의 질의에 대해 복합 인덱스를 사용하고 있지만, 얼마나 많은 보조 인덱스를 사용할 수 있는가에 대해 확실치 않습니다. 나는 실제로 자바 드라이버를 사용하고 있기 때문에이 방법을 사용하고있다. – Lipu

+0

무엇을 의미합니까? 얼마나? 하나의 쿼리는 하나의 보조 인덱스를 사용합니다. – WiredPrairie

+0

나는 한 번에 하나의 쿼리 만 하나의 인덱스를 사용할 수 있지만 내 질문은 얼마나 많은 보조 인덱싱이 mongodb 데이터베이스/콜렉션에서 가능한지 알고있다. 내가 원하는만큼 또는 제한이 있습니까 ???? 필자의 경우처럼 날짜, 날짜 및 시간, 날짜 및 시간 및 product_id 등의 색인만을 원한다. – Lipu

관련 문제