unwind:分解一個文檔中的數組字段(例如數組大小爲n) 爲 (n)個文檔
官方案例:
inventory數據:{ "_id" : 1, "item" : "ABC1", sizes: [ "S", "M", "L"] }
執行:db.inventory.aggregate( [ { $unwind : "$sizes" } ] )
結果:{ "_id" : 1, "item" : "ABC1", "sizes" : "S" }
{ "_id" : 1, "item" : "ABC1", "sizes" : "M" }
{ "_id" : 1, "item" : "ABC1", "sizes" : "L" }
注:
1 includeArrayIndex:給每個數組的元素增加序號
db.inventory.aggregate( [ { $unwind: { path: "$sizes", includeArrayIndex: "arrayIndex" } } ] )
{ "_id" : 1, "item" : "ABC", "sizes" : "S", "arrayIndex" : NumberLong(0) }
{ "_id" : 1, "item" : "ABC", "sizes" : "M", "arrayIndex" : NumberLong(1) }
{ "_id" : 1, "item" : "ABC", "sizes" : "L", "arrayIndex" : NumberLong(2) }
2 preserveNullAndEmptyArrays:default:false 如果是true,將包括null,空,或者缺失
數據:
{ "_id" : 1, "item" : "ABC", "sizes": [ "S", "M", "L"] }
{ "_id" : 2, "item" : "EFG", "sizes" : [ ] }
{ "_id" : 3, "item" : "IJK", "sizes": "M" }
{ "_id" : 4, "item" : "LMN" }
{ "_id" : 5, "item" : "XYZ", "sizes" : null }
結果:
db.inventory.aggregate( [
{ $unwind: { path: "$sizes", preserveNullAndEmptyArrays: true } }
] )
{ "_id" : 1, "item" : "ABC", "sizes" : "S" }
{ "_id" : 1, "item" : "ABC", "sizes" : "M" }
{ "_id" : 1, "item" : "ABC", "sizes" : "L" }
{ "_id" : 2, "item" : "EFG" }
{ "_id" : 3, "item" : "IJK", "sizes" : "M" }
{ "_id" : 4, "item" : "LMN" }
{ "_id" : 5, "item" : "XYZ", "sizes" : null }
Spring data mongodb:
TypedAggregation<Role> agg = Aggregation.newAggregation(Role.class,
Aggregation.unwind("sizes","arrayIndex",true)
);
AggregationResults<Document> result = mongoTemplate.aggregate(agg,Document.class);
result.getMappedResults().forEach(document -> System.out.println(document));
注意:
返回的數據可以用org.bson.Document 來接收,也可以自定義實體類來接收