如何解决如果条件始终返回真实的弹簧数据mongodb
我正在使用spring数据编写聚合查询,以预测活动是否成功。
如果活动不是CONNECTIVITY_CHECK
类型且其状态等于SUCCESS
,则该活动成功。
这是我编写的用于创建项目阶段的代码。
private ProjectionOperation getProjection() {
CriteriaDefinition successFulActivityCriteria = getCriteriaForSuccessFulNonHearbeatActivity();
return Aggregation.project()
.and(ConditionalOperators.when(successFulActivityCriteria).then(1).otherwise(0))
.as(isSuccessfulActivityField);
}
private Criteria getCriteriaForSuccessFulNonHearbeatActivity() {
Criteria criteria = new Criteria();
criteria.and(ActivityHistoryEntityKeys.type)
.ne(CONNECTIVITY_CHECK.toString())
.and(ActivityHistoryEntityKeys.activityStatus)
.is(SUCCESS.toString());
return criteria;
}
此代码创建以下MongoDB查询
db.getCollection('entityActivity').aggregate([
{
"$project" : {
"isSuccessfulActivity" : { "$cond" : { "if" : [{ "$ne" : ["$type","CONNECTIVITY_CHECK"]},{ "$eq" : ["$activityStatus","SUCCESS"]}],"then" : 1,"else" : 0}}
}
])
我面临的问题是,即使类型为CONNECTIVITY_CHECK
Mongo数据库记录:
/* 1 */
{
"_id" : ObjectId("5f92caaab3823704a346766b"),"accountIdentifier" : "accountIdentifier","type" : "ENTITY_USAGE",//other value is `CONNECTIVITY_CHECK`
"activityStatus" : "SUCCESS",}
我需要帮助来了解java代码(ConditionalOperators.when
)中可能存在的问题,以便它生成始终为true的if语句。
此外,该语句的格式为if: []
。我还没有在需要列表的任何文档中看到任何if语句。请指导我我做错了什么。
PS:着眼于问题,似乎可以使用find查询来解决,但这只是我要解决的问题的一小部分。我将在下一个组语句中使用isSuccessfulActivityField
。
解决方法
检查此-
db.collection.aggregate([
{
"$project": {
"isSuccessfulActivity": {
"$cond": {
"if": {
$and: [
{
"$ne": [
"$type","CONNECTIVITY_CHECK"
]
},{
"$eq": [
"$activityStatus","SUCCESS"
]
}
]
},"then": 1,"else": 0
}
}
}
}
])
,
问题在于if条件接受布尔运算,但是代码编写方式却得到了布尔运算符列表。我想这在MongoDB世界中也意味着什么,这就是为什么没有错误返回的原因。
@ wak786给出的MongoDB查询解决了该问题。
我在这里添加spring数据代码:
private ProjectionOperation getProjection() {
And successFulActivityCriteria = getCriteriaForSuccessFulNonHearbeatActivity();
return Aggregation.project()
.and(ConditionalOperators.when(successFulActivityCriteria).then(1).otherwise(0))
.as(isSuccessfulActivityField);
}
private And getCriteriaForSuccessFulNonHearbeatActivity() {
return And.and(
ComparisonOperators.valueOf(ActivityHistoryEntityKeys.type).notEqualToValue(CONNECTIVITY_CHECK.toString()),ComparisonOperators.valueOf(ActivityHistoryEntityKeys.activityStatus).equalToValue(SUCCESS.toString()));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。