使用Java驱动程序进行MongoDB聚合

Ops*_*sse 17 java mongodb aggregation-framework

我需要你帮助将MongoDB聚合框架与java驱动程序一起使用.即使有这个文档,我也不明白如何编写我的请求.

我想从我的收藏中的所有项目中获取200个最旧的视图.这是我的mongo查询(在控制台模式下工作方式如下):

db.myCollection.aggregate(
    {$unwind : "$views"},
    {$match : {"views.isActive" : true}},
    {$sort : {"views.date" : 1}},
    {$limit : 200},
    {$project : {"_id" : 0, "url" : "$views.url", "date" : "$views.date"}}
)
Run Code Online (Sandbox Code Playgroud)

此集合中的项目具有一个或多个视图.我的问题不是关于请求结果,我想知道java语法.

Ops*_*sse 41

终于找到了解决方案,我得到的结果与原始请求相同.

Mongo Driver 3:

汇总文件

MongoCollection<Document> collection = database.getCollection("myCollection");

AggregateIterable<Document> output = collection.aggregate(Arrays.asList(
        new Document("$unwind", "$views"),
        new Document("$match", new Document("views.isActive", true)),
        new Document("$sort", new Document("views.date", 1)),
        new Document("$limit", 200),
        new Document("$project", new Document("_id", 0)
                    .append("url", "$views.url")
                    .append("date", "$views.date"))
        ));

// Print for demo
for (Document dbObject : output)
{
    System.out.println(dbObject);
}
Run Code Online (Sandbox Code Playgroud)

您可以使用静态导入使其更具可读性:
import static com.mongodb.client.model.Aggregates.*;.
请参阅koulini回答complet示例.

Mongo Driver 2:

汇总文件

Iterable<DBObject> output = collection.aggregate(Arrays.asList(
        (DBObject) new BasicDBObject("$unwind", "$views"),
        (DBObject) new BasicDBObject("$match", new BasicDBObject("views.isActive", true)),
        (DBObject) new BasicDBObject("$sort", new BasicDBObject("views.date", 1)),
        (DBObject) new BasicDBObject("$limit", 200),
        (DBObject) new BasicDBObject("$project", new BasicDBObject("_id", 0)
                    .append("url", "$views.url")
                    .append("date", "$views.date"))
        )).results();

// Print for demo
for (DBObject dbObject : output)
{
    System.out.println(dbObject);
}
Run Code Online (Sandbox Code Playgroud)

查询转换逻辑: 查询转换逻辑 感谢这个链接


Nik*_*ros 6

值得指出的是,通过使用MongoDB的Java聚合方法,您可以大大改善此处答案所显示的代码。

让我们以代码示例为例,OP对他自己的问题的回答。

AggregateIterable<Document> output = collection.aggregate(Arrays.asList(
        new Document("$unwind", "$views"),
        new Document("$match", new Document("views.isActive", true)),
        new Document("$sort", new Document("views.date", 1)),
        new Document("$limit", 200),
        new Document("$project", new Document("_id", 0)
                    .append("url", "$views.url")
                    .append("date", "$views.date"))
));
Run Code Online (Sandbox Code Playgroud)

我们可以如下重写上面的代码;

import static com.mongodb.client.model.Aggregates.*;

AggregateIterable output = collection.aggregate(Arrays.asList(
                unwind("$views"),
                match(new Document("views.isActive",true)),
                sort(new Document("views.date",1)),
                limit(200),
                project(new Document("_id",0)
                        .append("url","$views.url")
                        .append("date","$views.date"))
));
Run Code Online (Sandbox Code Playgroud)

显然,您将需要相应的静态导入,但除此之外,第二个示例中的代码更干净更安全(因为您不必每次都键入操作符),更具可读性和更漂亮的 IMO。