文档结构(部分数据展示):
{
"_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() :
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"}
}})
结果:
上面聚合代码转换为java的mongoTemplate操作Mongodb的代码为:
//封装查询条件
List 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"));