【问题标题】:Morphia java.util.Arrays$ArrayList cannot be cast to com.mongodb.DBObject when making a Projection.projectionMorphia java.util.Arrays$ArrayList 在制作 Projection.projection 时无法转换为 com.mongodb.DBObject
【发布时间】:2020-05-05 11:58:11
【问题描述】:

我正在尝试进行以下聚合

db.getCollection("order").aggregate(
    [
        { 
            "$project" : {
                "_id" : -1.0, 
                "customerId" : "$customer.customerId", 
                "hasOrderInT0" : {
                    "$cond" : [
                        {
                            "$and" : [
                                {
                                    "$gte" : [
                                        "$date", 
                                        1577829600.0
                                    ]
                                }, 
                                {
                                    "$lte" : [
                                        "$date", 
                                        1580507999.0
                                    ]
                                }
                            ]
                        }, 
                        1, 
                        0
                    ]
                }
            }
        }
    ]
);

在一个 Java 应用程序中,我使用 Morphia 作为 ORM。基本上,如果日期在 2 个时间戳之间,它将在 hasOrderInT0 字段中输入 1,否则为 0。

long initialStart = 1577829600;
long initialEnd = 1580507999;

AggregationPipeline pipeline = databaseService.getConnection().createAggregation(Order.class)
                .project(
                        Projection.projection("_id", "-1"),
                        Projection.projection("customerId", "$customer.customerId"),
                        Projection.projection("hasOrderInT0",
                                Projection.expression(
                                        "$cond",
                                        Arrays.<Object>asList(
                                                new BasicDBObject(
                                                        "$and", Arrays.<Object>asList(
                                                        new BasicDBObject(
                                                                "$gte", Arrays.<Object>asList("$date", initialStart)
                                                        ),
                                                        new BasicDBObject(
                                                                "$lte", Arrays.<Object>asList("$date", initialEnd)
                                                        )
                                                )
                                                ),
                                                1,
                                                0
                                        )
                                )
                        )
                );

运行上述代码时,出现以下错误:

Caused by: java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to com.mongodb.DBObject
    at xyz.morphia.aggregation.AggregationPipelineImpl.toExpressionArgs(AggregationPipelineImpl.java:296)
    at xyz.morphia.aggregation.AggregationPipelineImpl.toDBObject(AggregationPipelineImpl.java:249)
    at xyz.morphia.aggregation.AggregationPipelineImpl.toDBObject(AggregationPipelineImpl.java:240)
    at xyz.morphia.aggregation.AggregationPipelineImpl.project(AggregationPipelineImpl.java:191)

这是我第一次将 Projection 与 Morphia 一起使用,我不知道这是否是实现在 mongo 控制台中工作的命令的正确方法。

PS:$project 只是来自更大聚合的管道,但这是令人感兴趣的部分,并且会给出错误,因此我出于演示目的对其进行了简化。

【问题讨论】:

    标签: java mongodb projection morphia


    【解决方案1】:

    事实证明,没有必要将 $cond 中的条件包装到 Arrays.&lt;Object&gt;asList 中。 Projection.expression 已经接受任意数量的参数,所以工作代码是:

    long initialStart = 1577829600;
    long initialEnd = 1580507999;
    
    AggregationPipeline pipeline = databaseService.getConnection().createAggregation(Order.class)
                    .project(
                            Projection.projection("_id", "-1"),
                            Projection.projection("customerId", "$customer.customerId"),
                            Projection.projection("hasOrderInT0",
                                    Projection.expression(
                                            "$cond",
                                                new BasicDBObject(
                                                        "$and", Arrays.<Object>asList(
                                                        new BasicDBObject(
                                                                "$gte", Arrays.<Object>asList("$date", initialStart)
                                                        ),
                                                        new BasicDBObject(
                                                                "$lte", Arrays.<Object>asList("$date", initialEnd)
                                                        )
                                                )
                                                ),
                                                1,
                                                0
                                    )
                            )
                    );
    

    BasicDBObject 是第一个参数,1 和 0 是第二个和第三个,它们将被 Morphia 包装器正确解释。

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2023-03-26
      • 2015-06-22
      • 1970-01-01
      相关资源
      最近更新 更多