将 MongoDb 查询转换为 Java BasicDbObject

Convert MongoDb query into Java BasicDbObject

我需要将 mongodb 查询转换为 java。 我有 "conversations" collection。 Mongo db 以这种方式查询并且有效。

{
    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);

但此代码无效

我的collection的数据是

    {
    "_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);

您的 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 )
            )
        )
    )
); 

确保 "dates" 是从 jodatime 之类的东西返回的 java.util.Date 类型,以便对序列化也有效。并确保您正在构建的是 UTC 时间。

示例:

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

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