问题描述
在将 MongoDB 聚合框架与 java 驱动程序结合使用时,我需要您的帮助.我不明白如何编写我的请求,即使使用 感谢这个链接
I need your help for using MongoDB aggregation framework with java driver. I don't understand how to write my request, even with this documentation.
I want to get the 200 oldest views from all items in my collection. Here is my mongo query (which works like I want in console mode):
db.myCollection.aggregate( {$unwind : "$views"}, {$match : {"views.isActive" : true}}, {$sort : {"views.date" : 1}}, {$limit : 200}, {$project : {"_id" : 0, "url" : "$views.url", "date" : "$views.date"}} )
Items in this collection have one or many views. My question is not about the request result, I want to know the java syntaxe.
Finally found the solution, I get the same result than with the original request.
Mongo Driver 3 :
Aggregate doc
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); }
You can make it more readable with static import :
import static com.mongodb.client.model.Aggregates.*;.
See koulini answer for complet example.
Mongo Driver 2 :
Aggregate doc
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); }
Query conversion logic : Thank to this link