2016-11-03 32 views
1

我有一个子文档是一个父文档的数组。 “设备”

在该数组中,我有一个属性是Date属性。

我想找个谁包含determinated日期子子文档这样的父母文件:

{ 
"_id" : ObjectId("5818fa596969a1339093a7da"), 
"fecha" : ISODate("2016-11-01T05:00:00.000Z"), 
"spot" : "5808e3926969a126c8365c94", 
"devices" : [ 
    { 
     "evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"), 
     "seenTimesCounter" : 0, 
     "category" : "PRE_PASAJERO", 
     "status" : "NO_CONECTADO" 
    }, 
    { 
     "evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"), 
     "seenTimesCounter" : 0, 
     "category" : "PRE_PASAJERO", 
     "status" : "NO_CONECTADO" 
    }, 
    { 
     "evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"), 
     "seenTimesCounter" : 0, 
     "category" : "PRE_PASAJERO", 
     "status" : "NO_CONECTADO" 
    }, 
    { 
     "evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"), 
     "seenTimesCounter" : 0, 
     "category" : "PRE_PASAJERO", 
     "status" : "NO_CONECTADO" 
    }, 
    { 
     "evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"), 
     "seenTimesCounter" : 0, 
     "category" : "PRE_PASAJERO", 
     "status" : "NO_CONECTADO" 
    }, 
    { 
     "evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"), 
     "seenTimesCounter" : 0, 
     "category" : "PRE_PASAJERO", 
     "status" : "NO_CONECTADO" 
    } 
] 
} 

我已经试过这在蒙戈外壳程序(和查询是好的,它返回我想要的) :

db.getCollection('spotMovimientos').aggregate([ 
{$match:{'devices.evaluationDate':ISODate("2016-11-01T20:26:00.000Z")}}, 
{$project: { 
'devices':{$filter:{ 
    input:'$devices', 
    as:'device', 
    cond: {$eq: ['$$device.evaluationDate', ISODate("2016-11-01T20:26:00.000Z")]} 
    } 
} } 
} 
]) 

谁能解释一下?我需要帮助将其转换为SPRING DATA

谢谢。

+0

请添加你到目前为止尝试过的。 – Veeram

回答

6

我设法解决我的问题与Spring引导版本1.4.1.RELEASE,我这样做:

Aggregation aggregation = newAggregation(
      match(Criteria.where("devices.evaluationDate").is(date)), 
      project().and(new AggregationExpression() { 
       @Override 
       public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) { 
        DBObject filterExpression = new BasicDBObject(); 
        filterExpression.put("input", "$devices"); 
        filterExpression.put("as", "device"); 
        filterExpression.put("cond", new BasicDBObject("$eq", Arrays.<Object> asList("$$device.evaluationDate", date))); 
        return new BasicDBObject("$filter", filterExpression); 
       } 
      }).as("devices") 
    ); 

    AggregationResults<SpotMovimientos> list = mongoOperations.aggregate(aggregation, 
      MyClass.class, MyClass.class); 

我详细制定基于这样的:Does Spring Data MongoDb support $filter array aggregations operator?

我的项目是在春季启动1.4 .0.RELEASE,但该版本没有AggregationExpression接口PUBLIC,所以我只是更新到1.4.1.RELEASE,我没有工作。