gpt4 book ai didi

java - 将 MongoDb 查询转换为 Java BasicDbObject

转载 作者:行者123 更新时间:2023-11-30 08:04:33 25 4
gpt4 key购买 nike

我需要将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com