使用MongoDB 3.0 Java驱动程序计算结果

时间:2015-11-01 18:54:35

标签: java mongodb

我只想获得一些查询的结果数量。具体来说,我想知道过去15分钟内有多少用户在线。所以,我设置连接:

mongoClient = new MongoClient("localhost", 3001);
database = mongoClient.getDatabase("database1");

然后在我的方法中,我得到了集合并发送了一个查询......:

MongoCollection<Document> users = database.getCollection("users");
users.find(and(gte("lastlogin",xvminago),lte("lastlogin",now)

我甚至不确定最后一步是否正确。但是在Javascript和.count()中这似乎很容易 - 我在Java中找不到的操作。而文档是奇怪的,并且不知何故都是不同的。 (我使用MongoDB Java Driver 3.0)

1 个答案:

答案 0 :(得分:4)

使用MongoCollection的 count() 方法,应用查询过滤器,该过滤器使用 Joda-Time 库中的Datetime对象简化了java中的日期操作。您可以查看 here 。基本上创建一个距当前时间15分钟的日期时间对象:

DateTime dt = new DateTime();
DateTime now = new DateTime();
DateTime subtracted = dt.minusMinutes(15);

然后使用变量构造日期范围查询以在count()方法中使用:

Document query = new Document("lastlogin", new Document("$gte", subtracted).append("$lte", now));
mongoClient = new MongoClient("localhost", 3001);
long count = mongoClient.getDatabase("database1")
                        .getCollection("users")
                        .count(query);

在分片群集中,如果存在孤立文档或正在进行块迁移,则基础 db.collection.count() 方法可能会导致计数不准确。因此,使用 aggregate() 方法更安全:

Iterator<Document> it = mongoClient.getDatabase("database1")
                       .getCollection("users")
                       .aggregate(Arrays.asList(
                            new Document("$match", new Document("lastlogin", 
                                new Document("$gte", subtracted).append("$lte", now))
                            ),
                            new Document("$group", new Document("_id", null)
                                .append("count", 
                                    new Document("$sum", 1)
                                )
                            )
                        )
                    ).iterator();
int count = it.hasNext() ? (Integer)it.next().get("count") : 0;