2015-07-10 3 views
1

Мне нужно преобразовать запрос mongodb в java. У меня есть коллекция «разговоров». Mongo db запрос таким образом, и это работа.Преобразование запроса MongoDb в Java BasicDbObject

{ 
    messages: { source: 1, $elemMatch: { date: { $gte: ISODate("2013-07-25 00:00:00"), $lt: ISODate("2013-08-26 00:00:00")}}} 
} 

И я Тринг в Java BasicDBObject

elemMatch = new BasicDBObject(); 
BasicDBObject retrievedField = new BasicDBObject(); 
elemMatch.put("date", new BasicDBObject("$gte",StartDate).append("$lte",EndDate)); 
elemMatch.put("source", 1); 
BasicDBObject up = new BasicDBObject(); 
up.put("$elemMatch",elemMatch); 
retrievedField.put("messages", up); 
DBCursor cursor = this.dbCollection.find(retrievedField).limit(10); 

но этот код не работает

данные моей коллекции является

{ 
    "_id" : ObjectId("51f130d6e4b0bf50e9bfc038"), 
    "saleId" : 2.43564e+07, 
    "saleCode" : "905155440001", 
    "randomId" : 9630, 
    "creatorId" : 8.21048e+06, 
    "recipientId" : 4.83831e+06, 
    "creatorType" : 1, 
    "returnReasonId" : 11, 
    "conversationClosed" : false, 
    "operatorCalled" : false, 
    "sellerNotified" : false, 
    "buyerNotified" : false, 
    "operatorCalledDate" : null, 
    "creationDate" : ISODate("2013-07-25T14:06:14.967Z"), 
    "lastUpdateDate" : ISODate("2013-08-15T08:46:10.115Z"), 
    "messages" : [ 
     { 
      "senderId" : 8.21048e+06, 
      "source" : 1, 
      "seenByBuyer" : true, 
      "seenBySeller" : true, 
      "seenByOperator" : true, 
      "date" : ISODate("2013-07-25T14:06:39.968Z"), 
      "messageBody" : "asdad" 
     }, 
     { 
      "senderId" : 8.21048e+06, 
      "source" : 1, 
      "seenByBuyer" : true, 
      "seenBySeller" : true, 
      "seenByOperator" : true, 
      "date" : ISODate("2013-07-25T14:06:59.978Z"), 
      "messageBody" : "asdasdawdwa" 
     }, 
     { 
      "senderId" : 0, 
      "source" : 4, 
      "seenByBuyer" : true, 
      "seenBySeller" : true, 
      "seenByOperator" : true, 
      "date" : ISODate("2013-07-25T14:07:20.044Z"), 
      "messageBody" : "ad" 
     } 
    ] 
} 

Любая помощь?

Calendar calStartDate = Calendar.getInstance(); 
     Calendar calEndDate = Calendar.getInstance(); 
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); 
     Date StartDate = simpleDateFormat.parse(messageStartDate); 
     Date EndDate = simpleDateFormat.parse(messageEndDate); 

     calStartDate.setTime(StartDate); 
     calEndDate.setTime(EndDate); 
     Date sdate = new DateTime(calStartDate.get(Calendar.YEAR),calStartDate.get(Calendar.MONTH), calStartDate.get(Calendar.DAY_OF_MONTH),calStartDate.get(Calendar.HOUR),calStartDate.get(Calendar.MINUTE), DateTimeZone.UTC).toDate(); 
     Date edate = new DateTime(calEndDate.get(Calendar.YEAR), calEndDate.get(Calendar.MONTH), calEndDate.get(Calendar.DAY_OF_MONTH), calEndDate.get(Calendar.HOUR), calEndDate.get(Calendar.MINUTE), DateTimeZone.UTC).toDate(); 

     BasicDBObject query = new BasicDBObject(
       "messages", 
       new BasicDBObject("$elemMatch",new BasicDBObject("source", 1).append("date", new BasicDBObject("$gte", sdate).append("$lt", edate))) 
     ); 

     DBCursor cursor = this.dbCollection.find(query).limit(10); 

ответ

1

Ваш запрос на оболочку был неверным в любом случае. Оно должно быть:

{ 
    "messages": { 
     "$elemMatch": { 
      "source": 1, 
      "date": { 
       "$gte": ISODate("2013-07-25 00:00:00"), 
       "$lt": ISODate("2013-07-26 00:00:00") 
     } 
     } 
    } 
} 

И это помогает следовать тем же правилам вложенности, так что вы не получите поток неправильный:

BasicDBObject query = new BasicDBObject(
    "messages", 
    new BasicDBObject(
     "$elemMatch", 
     new BasicDBObject("source", 1) 
      .append(new BasicDBObject(
       "date", 
       new BasicDBObject("$gte", StartDate) 
        .append("$lt", EndDate) 
      ) 
     ) 
    ) 
); 

Убедитесь, что «дата» имеет типа java.util.Date возвращенных из чего-то как jodatime, чтобы быть действительным и для сериализации. И убедитесь, что это время UTC, из которого вы строите.

Пример:

import org.joda.time.DateTime; 
import org.joda.time.DateTimeZone; 

Date StartDate = new DateTime(2013, 7, 25, 0, 0, DateTimeZone.UTC).toDate(); 
+0

SimpleDateFormat SimpleDateFormat = новый SimpleDateFormat ("гггг-ММ-дд чч: мм: сс"); Дата StartDate = simpleDateFormat.parse (messageStartDate); StartDate и endDate - это так? – neoerol

+1

@neoerol Нет, это строки. Вам нужно передать объект даты, как я уже сказал. MongoDB хранится как тип «Дата» BSON, а не строка. Используйте то, что производит 'java.util.Date', как я сказал в ответе. –

+0

@neoerol Добавлен простой пример, чтобы следовать в конце ответа. –

Смежные вопросы