2015-07-10 113 views
1

我需要將mongodb查詢轉換爲java。 我有「對話」集合。 MongoDB查詢這種方式,它的工作。將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

無論如何,你的shell查詢是不正確的。它應該是:

{ 
    "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( 「YYYY-MM-DD HH:MM:SS」); Date StartDate = simpleDateFormat.parse(messageStartDate); StartDate和endDate是這樣嗎? – neoerol

+1

@neoerol沒有那些是字符串。你需要像我說的那樣傳遞一個日期對象。 MongoDB存儲爲「日期」BSON類型而不是字符串。正如我在答案中所說的那樣,使用產生'java.util.Date'的東西。 –

+0

@neoerol在答案的最後添加了一個簡單的示例。 –