2015-10-07 5 views
2

Я пытаюсь сделать простой агрегат MongoDB здесь. В принципе у меня есть документы, как это:Ускоренная сборка Morphia возвращает другой результат, чем запрос Mongo db?

{ 
timestampInMs: 1444094140442, 
records: [ 
{ 
value: "testvalue", 
experiment: { 
id: "56105b0af2763b25806d1365", 
name: "integrationtest-kkkk", 
created: "2015-10-03T22:47:38.479+0000", 
updated: null 
}, 
sensorId: "testsensor", 
dataType: 1 
}, 
{ 
value: "testvalue2", 
experiment: { 
id: "56105b0af2763b25806d1365", 
name: "integrationtest-kkkk", 
created: "2015-10-03T22:47:38.479+0000", 
updated: null 
}, 
sensorId: "testsensor2", 
dataType: 1 
}, 
{ 
value: "testvalue3", 
experiment: { 
id: "56105b0af2763b25806d1365", 
name: "integrationtest-kkkk", 
created: "2015-10-03T22:47:38.479+0000", 
updated: null 
}, 
sensorId: "testsensor3", 
dataType: 1 
}, 
{ 
value: "testvalue4", 
experiment: { 
id: "56105b0af2763b25806d1365", 
name: "integrationtest-kkkk", 
created: "2015-10-03T22:47:38.479+0000", 
updated: null 
}, 
sensorId: "testsensor4", 
dataType: 1 
} 
], 
created: "2015-10-06T01:15:40.501+0000", 
updated: "2015-10-06T01:15:40.528+0000" 
} 

модель Java выглядит следующим образом

@Entity("sensordatadocs") 
@Indexes ({ 
    @Index(fields = @Field("timestampInMs"), options = @IndexOptions(name = "timestamp_ms_index")) 
}) 
public class DbSensorDataDocument { 

    @Id 
    // Should be milliseconds since Epoch 
    private Long timestampInMs; 

    @Embedded 
    private List<DbSensorDataRecord> records; 

    private Date created; 

    private Date updated; 
} 

public class DbSensorDataRecord { 

    private String value; 

    @Reference 
    private Experiment experiment; 

    private String sensorId; 

    private int dataType; 
} 

Когда я использовал запрос DB

db.sensordatadocs.aggregate([{$unwind: "$records"}]) 

Он дал мне 4 документа, каждый документ в «записи "содержит один элемент, который соответствует элементу в исходном массиве. Однако, когда я использовал API морфий, как и это:

Iterator<DbSensorDataDocument> iter = datastore.createAggregation(DbSensorDataDocument.class) 
     .unwind("records").aggregate(DbSensorDataDocument.class); 

Было бы возвращать результат, как это:

{ 
timestampInMs: 1444094140442, 
sensorId: "testsensor", 
value: "testvalue", 
experimentId: "56105b0af2763b25806d1365", 
dataType: 1 
}, 
{ 
timestampInMs: 1444094140442, 
sensorId: "testsensor", 
value: "testvalue", 
experimentId: "56105b0af2763b25806d1365", 
dataType: 1 
}, 
{ 
timestampInMs: 1444094140442, 
sensorId: "testsensor", 
value: "testvalue", 
experimentId: "56105b0af2763b25806d1365", 
dataType: 1 
}, 
{ 
timestampInMs: 1444094140442, 
sensorId: "testsensor", 
value: "testvalue", 
experimentId: "56105b0af2763b25806d1365", 
dataType: 1 
} 

Это как мой итерация код выглядит следующим образом:

while (iter.hasNext()) { 
      DbSensorDataDocument doc = iter.next(); 
      final SensorDataRecord record = SensorDataUtils.flattenSensorDataDocument(doc); 
      result.add(record); 
     } 

Обратите внимание, что количество элементов правильное, однако значения внутри «записей» неверны, Фактически они являются значениями только первого элемента в исходном массиве * *. Почему это так? Пожалуйста помоги. Благодаря!

Morphia версия 1.0.1

+0

Звучит глупо, но вы уверены, что итерация выполнена правильно? – xeraa

+0

Я обновил итерационный код в сообщении. Должно быть правильно? o.o – littlejedi

ответ

0

Причина такого поведения является проблема кэша Морфий. В вашем случае Morphia обрабатывает все результаты DbSensorDataDocument объектов в одной строке (из-за идентичного первичного ключа timestampInMs) и возвращает в кешированной версии.

Чтобы решить эту проблему, нужно исключить поле timestampInMs из результатов с проекцией агрегации:

Iterator<DbSensorDataDocument> iter = datastore.createAggregation(DbSensorDataDocument.class) 
     .unwind("records").project(
Projection.projection("timestampInMs").suppress(), 
Projection.projection("XXXXXX").aggregate(DbSensorDataDocument.class); 

Где XXXXX поля, которое вы хотите включить.

Смежные вопросы