MongoDB Aggregate Subtract Java Driver 3.3

时间:2016-11-14 18:31:44

标签: java mongodb

我正在使用减法运算符,如下面的shell查询,但无法弄清楚如何在Java中进行减法。

db.deviceDetail.aggregate([
    {$match: {'accountId':23, 'status':'Stopped'}},
    {'$project': {
            'durationDiff': {'$subtract': [1479093620000, '$durationDate']},
            'stopStartDiff': {'$subtract': [1479093620000, '$stopStart']},
            'stopStart': 1,
            'durationDate': 1,
            '_id':0
        }
    },
    {'$match': {$or:[{'durationDiff': {'$gt': 0}}, {'stopStartDiff': {'$gt': 0}}]}}
 ])

Java API似乎不支持减法运算符,那么如何定义下面的durationDiff和stopStartDiff计算呢?

AggregateIterable<Document> rslt = coll.aggregate(Arrays.asList(
                match(and(eq("assetName", "accountId"), eq("assetName", "accountId"))),
                project(fields(
                        excludeId(),
                        include(
                            "durationDiff", ...,
                            "stopStartDiff", ...,
                            "stopStart",
                            "durationDate"
                        )
                )),
                match(or(gt("durationDiff", 0), gt("stopStartDiff", 0)))
        ));

示例文件:

  {
    "_id" : ObjectId("563064a4e4b0ea032ae14f77"),
    "accountId" : NumberLong(23),
    "stopStart" : NumberLong("1460133175000"),
    "status" : "Stopped",
    "durationDate" : NumberLong("1460133175000")
}

1 个答案:

答案 0 :(得分:2)

您可以尝试类似于您的简单用例。你必须对其他变量做同样的事情。这将计算durationDiff。

对于2.x版本

BasicDBList values = new BasicDBList();
values.add(1479093620000L);
values.add("$durationDate");

AggregateIterable<Document> rslt = dbCollection.aggregate(Arrays.asList(
            project(fields(
                    excludeId(),
                    include(
                            "durationDiff",
                            "durationDate"
                    ),
                    new BasicDBObject("durationDiff", new BasicDBObject("$subtract", values))
                    )
            )
    ));

适用于3.x版本

使用BsonDocument - 输入安全版本

BsonArray operands = new BsonArray();
operands.add(new BsonInt64(1479093620000L));
operands.add(new BsonString("$durationDate"));

BsonDocument subtract = new BsonDocument("$subtract", operands);


AggregateIterable<BsonDocument> rslt = dbCollection.aggregate(Arrays.asList(
        project(fields(
                excludeId(),
                include(
                        "durationDiff",
                        "durationDate"
                ),
                new BsonDocument("durationDiff", subtract)
                )
        )
));

使用文档 - 非类型安全版

AggregateIterable<Document> rslt = dbCollection.aggregate(Arrays.asList(
        project(fields(
                excludeId(),
                include(
                        "durationDiff",
                        "durationDate"
                ),
                new Document("durationDiff", new Document("$subtract", Arrays.asList(1479093620000L, "$durationDate")))
                )
        )
));