玫瑰步道 2019-07-06 17:23 采纳率: 0%
浏览 627

MongoDB语句转转java实现

关于MongoDB命令转java实现:使用mongodb-driver.jar驱动

db.test.aggregate(
    [
        {
            $project: 
                { 
                        dt:
                            {
                                $dateToString: 
                                {
                                    format: "%Y-%m-%d %H:%M:%S:%L", date:{"$add":[new Date(0),"$time",28800000]}
                                }
                            }
                }
        },
        {
            $group: 
            {
                _id:"$dt"
            }
        }
    ]
);

请问上述命令使用java该怎么实现?
我尝试使用:

DBCollection coll = getDBCollection(dbName,collectionName);
        List<DBObject> pipeline = new ArrayList<>();

        String projectStr = "{$project:{dt:{$dateToString: {format: '%Y-%m-%d %H:%M:%S:%L', date:{'$add':[new Date(0),'$ti',28800000]}}}}";
        DBObject project = (DBObject) com.mongodb.util.JSON.parse(projectStr);
        pipeline.add(project);

        String groupStr = "{$group:{_id:'$ti'}}";
        DBObject group = (DBObject) com.mongodb.util.JSON.parse(groupStr);
        pipeline.add(group);

        AggregationOutput out = coll.aggregate(pipeline);
        System.out.println(out.results());

但是projectStr不能转成DBObject。后来又尝试使用

 Document sub_project = new Document();
        sub_project.put("dt", "{$dateToString:{format:'%Y-%m-%d %H',date:{$add:[new Date(0),'$ti',28800000]}}}");
        Document project = new Document("$project", sub_project);

        Document sub_group = new Document();
        sub_group.put("_id", "$dt");
        Document group = new Document("$group", sub_group);
        List<Document> aggregateList = new ArrayList<Document>();
        aggregateList.add(project);
        aggregateList.add(group);

        JSONObject ret_obj = new JSONObject();
        AggregateIterable<Document> resultset = collection.aggregate(aggregateList);
                while(cursor.hasNext()) {
                Document item_doc = cursor.next();
                System.out.println(">>>>>"+item_doc);
            }

结果输出的内容是:

>>>>>{_id={$dateToString:{format:'%Y-%m-%d %H',date:{$add:[new Date(0),'$ti',28800000]}}}}}

请问到底该怎么实现?

  • 写回答

1条回答

  • 玫瑰步道 2019-07-06 18:02
    关注

    终于实现了。。。方法如下:

     Map map=new HashMap();
            map.put("format","%H");
            map.put("date",new Document("$add",Arrays.asList(new Date(0),"$ti")));
            Document groupFiles=new Document();
            groupFiles.put("dt",new Document("$dateToString", map));
    
            Document project = new Document("$project", groupFiles);
    
            Document sub_group = new Document();
            sub_group.put("_id", "$dt");
            Document group = new Document("$group", sub_group);
            List<Document> aggregateList = new ArrayList<Document>();
            aggregateList.add(project);
            aggregateList.add(group);
    
            AggregateIterable<Document> resultset = collection.aggregate(aggregateList);
            MongoCursor<Document> cursor = resultset.iterator();
    
    评论

报告相同问题?

悬赏问题

  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示