Я пытаюсь сделать простой агрегат 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
Звучит глупо, но вы уверены, что итерация выполнена правильно? – xeraa
Я обновил итерационный код в сообщении. Должно быть правильно? o.o – littlejedi