我对使用MongoDB AggregateOperation驱动程序执行$ unwind活动的示例代码感兴趣。 AggregateOperation似乎与MongoDB版本3+ Java驱动程序相关联。
使用AggregateOperation,我如何展开下面显示的“sizes”数组?
{ "_id" : ObjectId("56928aa190f425c1e987abc3d"), "item" : "Fleece-lined jeans", "sizes" : [ "30", "31", "38", "40", "42" ], "count" : 3 }
我在这个论坛上看到的聚合示例似乎主要是使用BasicDBObject对象,这些对象显然不会与版本3 Java API混合使用。
答案 0 :(得分:2)
您必须在内部调用静态方法parse
import org.bson.Document;
上课。
因此,下面的代码行应该在mongodb3.0驱动程序中为你展开sizes
数组对象。
MongoClient client = new MongoClient();
MongoDatabase mongoDatabase = client.getDatabase("test");
MongoCollection<Document> mongoCollection = mongoDatabase
.getCollection("unwind");
List<Document> pipeline;
pipeline = Arrays.asList(Document.parse("{$unwind:\"$sizes\"}"));
List<Document> results = mongoCollection.aggregate(pipeline).into(
new ArrayList<Document>());
for (Document cur : results) {
System.out.println(cur.toJson());
}
对于3.2 java驱动程序。
import static com.mongodb.client.model.Aggregates.unwind;
Bson unwind = unwind("$sizes");
List<Bson> pipeline = asList(unwind);
MongoClient c = new MongoClient();
MongoCollection<Document> collection = c.getDatabase("test")
.getCollection("unwind");
List<Document> results = collection.aggregate(pipeline).into(
new ArrayList<Document>());
for (Document cur : results) {
System.out.println(cur.toJson());
}
}
此处test
是数据库,unwind
是集合。
这将展开大小数组对象,下面是输出文档。
{ "_id" : { "$oid" : "5692fed991b81360d23f1b54" }, "item" : "Fleece-lined jeans", "sizes" : "30", "count" : 3.0 }
{ "_id" : { "$oid" : "5692fed991b81360d23f1b54" }, "item" : "Fleece-lined jeans", "sizes" : "31", "count" : 3.0 }
{ "_id" : { "$oid" : "5692fed991b81360d23f1b54" }, "item" : "Fleece-lined jeans", "sizes" : "38", "count" : 3.0 }
{ "_id" : { "$oid" : "5692fed991b81360d23f1b54" }, "item" : "Fleece-lined jeans", "sizes" : "40", "count" : 3.0 }
{ "_id" : { "$oid" : "5692fed991b81360d23f1b54" }, "item" : "Fleece-lined jeans", "sizes" : "42", "count" : 3.0 }
上面的代码没有使用在3.0版本的MongoDB java驱动程序中弃用的DBObject类。
在3.2版本的mongodb驱动程序中测试了3.0版本的代码,它产生了相同的结果。
答案 1 :(得分:0)
我试过这个解决方案。它基于This documentation
AggregateIterable<Document> iterable = db.getCollection("inventory").aggregate(asList(
new Document("$unwind", "$sizes")
));
iterable.forEach(new Block<Document>() {
public void apply(Document document) {
System.out.println(document.toJson());
}
});