将 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();
我需要将 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();