文档结构(部分数据展现):java
{ "_id": ObjectId("5cf774a317d273d688fffffc"), "_class": "com.sunshine.aunt.model.po.ContractItemExpenseStatistics", "statisticsDatetime": "2019-05-22", "statisticsList": [ { "ic": "0600", "sit": "2", "a1": "660.00", "a2": "420.00", "a3": "5496.00", "a4": "3860.00", "a5": "0", "a6": "0", "a7": "0", "tt": "2716.00" }, { "ic": "0700", "sit": "3", "a1": "0.00", "a2": "1105.00", "a3": "3070.00", "a4": "3070.00", "a5": "0", "a6": "0", "a7": "0", "tt": "1105.00" }, { "ic": "0400", "sit": "2", "a1": "330.00", "a2": "510.00", "a3": "14800.00", "a4": "7423.00", "a5": "0", "a6": "0", "a7": "0", "tt": "8217.00" }, { "ic": "0500", "sit": "2", "a1": "20.00", "a2": "384.00", "a3": "6028.00", "a4": "7180.00", "a5": "0.00", "a6": "18.00", "a7": "400.00", "tt": "-748.00" }, { "ic": "1200", "sit": "2", "a1": "1050.00", "a2": "1470.00", "a3": "29400.00", "a4": "21600.00", "a5": "0", "a6": "0", "a7": "0", "tt": "10320.00" }, { "ic": "0100", "sit": "1", "a1": "21380.00", "a2": "27238.00", "a3": "310351.00", "a4": "187887.00", "a5": "150.00", "a6": "0.00", "a7": "2250.00", "tt": "171082.00" } ], "storeId": 1297, "parentStoreId": 2, "storeType": "B" }, /*5createdAt: 2019/6/5下午3: 52: 03*/{ "_id": ObjectId("5cf774a317d273d688fffffb"), "_class": "com.sunshine.aunt.model.po.ContractItemExpenseStatistics", "statisticsDatetime": "2019-05-18", "statisticsList": [ { "ic": "0100", "sit": "1", "a1": "320.00", "a2": "304.00", "a3": "3042.00", "a4": "0", "a5": "0", "a6": "0", "a7": "0", "tt": "3666.00" } ], "storeId": 20089, "parentStoreId": 20079, "storeType": "D" }, /*6createdAt: 2019/6/5下午3: 52: 03*/{ "_id": ObjectId("5cf774a317d273d688fffffa"), "_class": "com.sunshine.aunt.model.po.ContractItemExpenseStatistics", "statisticsDatetime": "2019-05-04", "statisticsList": [ { "ic": "0600", "sit": "2", "a1": "310.00", "a2": "70.00", "a3": "1400.00", "a4": "0", "a5": "0", "a6": "0", "a7": "0", "tt": "1780.00" }, { "ic": "1500", "sit": "2", "a1": "0", "a2": "0", "a3": "0", "a4": "3300.00", "a5": "0", "a6": "0", "a7": "0", "tt": "-3300.00" }, { "ic": "0300", "sit": "1", "a1": "310.00", "a2": "150.00", "a3": "2600.00", "a4": "0", "a5": "0", "a6": "0", "a7": "0", "tt": "3060.00" }, { "ic": "0100", "sit": "1", "a1": "1620.00", "a2": "1934.00", "a3": "17537.00", "a4": "2500.00", "a5": "0", "a6": "0", "a7": "0", "tt": "18591.00" } ], "storeId": 20082, "parentStoreId": 20079, "storeType": "D" }, /*7createdAt: 2019/6/5下午3: 52: 03*/{ "_id": ObjectId("5cf774a317d273d688fffff9"), "_class": "com.sunshine.aunt.model.po.ContractItemExpenseStatistics", "statisticsDatetime": "2019-05-10", "statisticsList": [ { "ic": "0600", "sit": "2", "a1": "0.00", "a2": "60.00", "a3": "1300.00", "a4": "1300.00", "a5": "0", "a6": "0", "a7": "0", "tt": "60.00" }, { "ic": "0400", "sit": "2", "a1": "0.00", "a2": "0.00", "a3": "0", "a4": "646.00", "a5": "0.00", "a6": "0.00", "a7": "646.00", "tt": "-646.00" }, { "ic": "1500", "sit": "2", "a1": "300.00", "a2": "60.00", "a3": "2800.00", "a4": "0", "a5": "0", "a6": "0", "a7": "0", "tt": "3160.00" }, { "ic": "0500", "sit": "2", "a1": "310.00", "a2": "70.00", "a3": "5000.00", "a4": "0", "a5": "0", "a6": "0", "a7": "0", "tt": "5380.00" }, { "ic": "0300", "sit": "1", "a1": "510.00", "a2": "160.00", "a3": "5000.00", "a4": "4955.00", "a5": "0.00", "a6": "0.00", "a7": "2255.00", "tt": "715.00" }, { "ic": "1200", "sit": "2", "a1": "0.00", "a2": "0.00", "a3": "0", "a4": "3000.00", "a5": "0.00", "a6": "0.00", "a7": "115.00", "tt": "-3000.00" }, { "ic": "0100", "sit": "1", "a1": "1540.00", "a2": "1490.00", "a3": "17400.00", "a4": "18804.00", "a5": "0", "a6": "0", "a7": "0", "tt": "1626.00" } ], "storeId": 20080, "parentStoreId": 20079, "storeType": "D" }
须要实现效果:数组
where storeId=1297 and statisticsList.ic in ("0100", "0600")
查询出storeId=1297而且内嵌数组对象statisticsList的ic字段等于0100、0600的,不等于的不返回,这个时候就须要使用聚合方法aggregate() :3d
db.test.aggregate( {$match: {storeId:1297}} ,{$unwind: "$statisticsList"} ,{$match: {"statisticsList.ic":{$in: ["0100", "0600"]}}} ,{$group: { _id: "$_id", storeId:{$first: "$storeId"}, storeType:{$first: "$storeType"}, statisticsDatetime:{$first: "$statisticsDatetime"}, statisticsList:{$push:"$statisticsList"} }})
结果:code
上面聚合代码转换为java的mongoTemplate操做Mongodb的代码为:对象
//封装查询条件 List<AggregationOperation> operations = new ArrayList<>(); operations.add(Aggregation.match(Criteria.where("storeId").is(1297))); operations.add(Aggregation.unwind("statisticsList")); operations.add(Aggregation.match(Criteria.where("statisticsList.ic").in("0100", "0600"))); operations.add(Aggregation.group("_id") .first("storeId").as("storeId") .first("storeType").as("storeType") .first("statisticsDatetime").as("statisticsDatetime") .push("statisticsList").as("statisticsList"));