Java Morphia展开聚合返回的结果与Mongo db查询不同?

Java Morphia展开聚合返回的结果与Mongo db查询不同?,java,mongodb,morphia,Java,Mongodb,Morphia,我在这里尝试做一个简单的MongoDB聚合。基本上我有这样的文件: { timestampInMs: 1444094140442, records: [ { value: "testvalue", experiment: { id: "56105b0af2763b25806d1365", name: "integrationtest-kkkk", created: "2015-10-03T22:47:38.479+0000", updated: null }, sensorId: "testse

我在这里尝试做一个简单的MongoDB聚合。基本上我有这样的文件:

{
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"
}
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
}
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;
}
它给了我4个文档,每个文档的“记录”包含一个与原始数组中的项相对应的项。但是,当我使用Morphia的API时,如下所示:

{
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"
}
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版

该行为的原因是Morphia缓存问题。在您的例子中,Morphia将DbSensorDataDocument实体的所有结果视为同一行(因为主键timestaminms相同),并返回缓存版本

要解决此问题,必须使用聚合投影从结果中排除字段timestampInMs:

Iterator<DbSensorDataDocument> iter = datastore.createAggregation(DbSensorDataDocument.class)
        .unwind("records").project(
 Projection.projection("timestampInMs").suppress(), 
 Projection.projection("XXXXXX").aggregate(DbSensorDataDocument.class);
Iterator iter=datastore.createAggregation(DbSensorDataDocument.class)
.展开(“记录”).项目(
Projection.Projection(“timestaminms”).suppress(),
Projection.Projection(“XXXXXX”).aggregate(DbSensorDataDocument.class);

其中XXXXX是您想要包含的字段。

听起来很愚蠢,但您确定迭代正确完成了吗?我已经在帖子中更新了迭代代码。应该正确吗?O.O