Java mongodb中的复杂查询
我想从java执行一个复杂的mongodb查询。我有四个字段Java mongodb中的复杂查询,java,mongodb,Java,Mongodb,我想从java执行一个复杂的mongodb查询。我有四个字段userid,statusid,dateTO,和dateFrom。复杂的查询类似于(userid或statusid)和(dateFrom
userid
,statusid
,dateTO
,和dateFrom
。复杂的查询类似于(userid或statusid)和(dateFrom
。我现在有一个疑问:
DBObject query = new BasicDBObject();
ArrayList orList = new ArrayList();
ArrayList andList = new ArrayList();
orList.add(new BasicDBObject("user.id", id));
orList.add(new BasicDBObject("retweeted_status.user.id", id));
andList.add(new BasicDBObject("date_posted", new BasicDBObject("$gt", dateFrom)));
andList.add(new BasicDBObject("date_posted", new BasicDBObject("$lt", dataTo)));
orList.add(new BasicDBObject("$and", andList));
query = new BasicDBObject("$or", orList);
如何更改它以执行所需的查询?例如,当我试图向robomongo查询时,它看起来像:
db.coll.find({$and:[{ $or: [ {"user.id":414848505}, {"retweeted_status.user.id":414848505}] },{$and:[{"date_posted":{"$gt":1398948442000}},{"date_posted":{"$lt":1400111999000}}] } ]})
这是您想要的查询吗
{
"$and": [
{
"$or": [
{
"user.id" : <id>
},
{
"retweeted_status.user.id": <id>
}
]
},
{
"$and": [
{
"date_posted": {
"$gt": <dateFrom>
}
},
{
"date_posted": {
"$lt": <dateFrom>
}
}
]
}
]
}
类内;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.data.mongodb.core.MongoTemplate;
导入org.springframework.data.mongodb.core.query.Criteria;
导入org.springframework.data.mongodb.core.query.query;
@自动连线(必需=真)
私有MongoTemplate MongoTemplate;
//里面有一些方法
List=null;
查询=新查询();
query.addCriteria(Criteria.where(“date_posted”).gt(dateFrom);//对于传递数据很重要的数据类型
query.addCriteria(Criteria.where(“date_posted”).lt(dateTo);//对于传递数据很重要的数据类型
query.addCriteria(Criteria.where(“retweetd_status.user.id”).orOperator(Criteria.where(“retweetd_status.user.id”)).is(id));//数据类型对传递数据很重要//示例:Integer.valueOf(id);
list=mongoTemplate.find(query,className.class);//输入文档类名
是的,这正是我想要的查询。你确定你的代码吗?它似乎工作不正常。我在查询数据库时没有得到预期的结果。Idk,代码生成的查询字符串与上面的查询相同。
final DBObject userId = new BasicDBObject("user.id", id);
final DBObject retweetedStatusUserId = new BasicDBObject("retweeted_status.user.id", id);
final DBObject or = new BasicDBObject("$or", Arrays.asList(userId, retweetedStatusUserId));
final DBObject greaterThan = new BasicDBObject("$gt", dateFrom);
final DBObject datePostedGreaterThan = new BasicDBObject("date_posted", greaterThan);
final DBObject lessThan = new BasicDBObject("$lt", dateTo);
final DBObject datePostedLessThan = new BasicDBObject("date_posted", lessThan);
final DBObject and = new BasicDBObject("$and", Arrays.asList(datePostedGreaterThan, datePostedLessThan));
final DBObject query = new BasicDBObject("$and", Arrays.asList(or, and));
inside class;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
@Autowired(required = true)
private MongoTemplate mongoTemplate;
// inside some method
List<className> list=null;
Query query=new Query();
query.addCriteria(Criteria.where("date_posted").gt(dateFrom);//data type important for passing data
query.addCriteria(Criteria.where("date_posted").lt(dateTo);//data type important for passing data
query.addCriteria(Criteria.where("retweeted_status.user.id").orOperator(Criteria.where("retweeted_status.user.id")).is(id)); //data type important for passing data// example:Integer.valueOf(id);
list=mongoTemplate.find(query, className.class);//put your document class name