java - 将 MongoDb 查询转换为 Java BasicDbObject

标签 java mongodb mongodb-query mongodb-java

我需要将 mongodb 查询转换为 java。 我有“对话” 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 )
            )
        )
    )
); 

确保“日期”的类型为 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();

关于java - 将 MongoDb 查询转换为 Java BasicDbObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31334808/

相关文章:

java - 如何将声音从 Android 设备流式传输到 Java 服务器?

mongo 命令提示符中的 Mongodb 聚合

node.js - Mongoose MongoDB 地理空间查询

MongoDB 查询连接两个集合

java - 无法连接到 (EWS) 公共(public)日历文件夹 Java

java - 如何从 Java 传递和访问 C 数据?

javascript - MongoDB bulk.execute()花费太多时间插入无序

javascript - 按类型获取 2 个按字母顺序排列的第一个文档

javascript - 为什么 Virtual Populate 不能在 Node js 和 mongoose 上工作?场景: Product and Review by user

java - 迭代和比较大数据集