Сложный запрос в mongodb

1

Я хочу выполнить сложный запрос mongodb из java. У меня есть foure поля userid, statusid, dateTO и dateFrom. Сложный запрос - это что-то вроде (userid Or statusid) And (dateFrom < date < dateTo). У меня теперь был запрос unitl:

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}}] } ]})
Теги:

2 ответа

2
Лучший ответ

Это ваш желаемый запрос?

{
    "$and": [
        {
            "$or": [
                {
                    "user.id" : <id>
                },
                {
                    "retweeted_status.user.id": <id>
                }
            ]
        },
        {
            "$and": [
                {
                    "date_posted": {
                        "$gt": <dateFrom>
                    }
                },
                {
                    "date_posted": {
                        "$lt": <dateFrom>
                    }
                }
            ]
        }
    ]
}

Если да, попробуйте следующее:

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));
  • 0
    Да, это именно мой желаемый запрос.
  • 0
    Я не уверен, что мой код делает то, что я хочу.
Показать ещё 3 комментария
0
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню