我正在使用减法运算符,如下面的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")
}
答案 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")))
)
)
));