【mongoDB】Java中使用条件操作符进行查询
admin
2023-04-13 18:01:29
0次

查询时经常会用到$in之类的操作符,比如db.collection_0.find("_id":{"$in","0001","0002","0003"})。
但是shell归shell,java里应该怎么写,在这就拿$in作为例子。
PS:我喜欢$in,尤其key是一个array类型的时候。


我用的是mongo-java-driver 2.11.0

现在我有个collection叫col_0,然后我在里面存了这么写东西。
【mongoDB】Java中使用条件操作符进行查询
假设这是_id为0001的用户有0002和0003两个好友。
现在我想查询一个用户的好友的好友,就像“推荐好友”那样的东西。

Java代码的话,大概可以这样写:

DB db = MonFactory.getInstance().getMongo().getDB("test");
        DBCollection dbCollection = db.getCollection("col_0");
        BasicDBObject term = new BasicDBObject();
        term.put("_id", uid);
        DBObject curUserData = dbCollection.findOne(term);
        List p4pList = new ArrayList();
        p4pList.addAll((Collection) curUserData.get("pals"));
        DBObject result;
        term = new BasicDBObject("_id", new BasicDBObject("$in", p4pList));
        DBCursor cursor = dbCollection.find(term);
        while (cursor.hasNext()) {
            if ((result = cursor.next()) != null) {
                System.out.println(result.get("pals"));
            }
        }


使用的BasicDBObject的构造函数是这样定义的:

/**
 * creates an object with the given key/value
 * @param key  key under which to store
 * @param value value to stor
 */
public BasicDBObject(String key, Object value){
    super(key, value);
}


也就是说我把$in当作key来使用了。
按shell的语法来说貌似是那么回事,但我总觉得这种写法不够OO。
于是我用QueryBuilder这样写:

DB db = MonFactory.getInstance().getMongo().getDB("test");
        DBCollection dbCollection = db.getCollection("col_0");
        DBObject term = new BasicDBObject();
        term.put("_id", uid);
        DBObject curUserData = dbCollection.findOne(term);
        List p4pList = new ArrayList();
        p4pList.addAll((Collection) curUserData.get("pals"));
        DBObject result;
//      term = new BasicDBObject("_id", new BasicDBObject("$in", p4pList));
        term = QueryBuilder.start().and("id").in(p4pList).get();
        DBCursor cursor = dbCollection.find(term);
        while (cursor.hasNext()) {
            if ((result = cursor.next()) != null) {
                System.out.println(result.get("pals"));
            }
        }


有时候感觉OO真是自寻烦恼。
无论如何,条件操作符了这样就可以用了。


但我可能对对象关系映射之类的东西习惯了,所以我决定用Morphia什么的。
于是:

Mongo mongo = new MongoClient("localhost", 27017);
            DataStore store = new DataStore(mongo, "test");
            Query query = store.createQuery(Person.class);
            query.criteria("_id").equals(uid);
            query = store.createQuery(Person.class);
            query.criteria("_id").in(Arrays.asList(query.get().getPals()));
            for (Iterator itr = store.createQuery(Person.class)
                    .iterator(); itr.hasNext();) {
                System.out.println(itr.next().getPals());
            }



相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...