mongodb内嵌数组对象字段in查询

文档结构(部分数据展现):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"));