首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据字段的存在性,从MongoDB中用Spring构造布尔值

根据字段的存在性,从MongoDB中用Spring构造布尔值
EN

Stack Overflow用户
提问于 2019-12-24 08:42:59
回答 3查看 4.6K关注 0票数 0

我需要根据MongoDB和中文档中某个字段的存在来投影一个布尔值。

让我们假设我的Mongo DB中有文档。它们的结构如下(testedField可能不存在):

代码语言:javascript
运行
复制
{
    "_id": ObjectId("some object ID"),
    "field1": "some value",
    "field2": "another value",
    "testedField": "this field may be absent"
}

或者像这样:

代码语言:javascript
运行
复制
{
    "_id": ObjectId("some object ID"),
    "field1": "some value",
    "field2": "another value"
}

我还有一个数据类MyClass:

代码语言:javascript
运行
复制
@AllArgsConstructor
@Getter
public class MyClass {
    private String field1;
    private String field2;
    private boolean myBoolVal;
}

在我的DAO中,有一个方法将其字段的值投影到类中:

代码语言:javascript
运行
复制
public List<MyClass> findThings(Collection<ObjectId> ids) {
    Criteria criteria = where(ID).in(ids);
    Aggregation matchAndProject = newAggregation(
            match(criteria),
            project("field1", "field2")
                    .and("testedField").ne(null).as("myBoolVal"));
    return mongoTemplate.aggregate(matchAndProject, "my_collection", MyClass.class).getMappedResults();
}

如果存在true myBoolVal字段,则使用testedField,如果不存在,则使用false

但是上面的代码抛出了IllegalArgumentException("Values must not be null!")

有办法让它起作用吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-25 14:15:34

我找到了解决方案:只使用when("fieldName")而没有exists()is(null)等就足够了。

代码语言:javascript
运行
复制
public List<MyClass> findThings(Collection<ObjectId> ids) {
    Criteria criteria = where(ID).in(ids);
    Aggregation matchAndProject = newAggregation(
            match(criteria),
            project("field1", "field2")
                    .and(ConditionalOperators.when("testedField")
                        .then(true)
                        .otherwise(false))
                    .as("myBoolVal"));
    return mongoTemplate.aggregate(matchAndProject, "my_collection", MyClass.class).getMappedResults();
}
票数 -4
EN

Stack Overflow用户

发布于 2019-12-24 10:16:50

使用条件投影使用标准

代码语言:javascript
运行
复制
public List<MyClass> findThings(Collection<ObjectId> ids) {

    Cond condition = ConditionalOperators.when(Criteria.where("testedField")
        .exists(true))
        .then(true)
        .otherwise(false)
    ;
    Criteria criteria = where(ID).in(ids);
    Aggregation matchAndProject = newAggregation(
            match(criteria),
            project("field1", "field2")
                    and(condition).as("myBoolVal"));
    return mongoTemplate.aggregate(matchAndProject, "my_collection", MyClass.class).getMappedResults();
}
票数 2
EN

Stack Overflow用户

发布于 2019-12-24 08:59:26

为什么不使用Booleantrue (如果存在字段),falsenull (如果不存在)。

但是在您的例子中,字段myBoolVal anything等于false。有一件事-你的字段是最终的,你不能用它们做任何操作.将实体字段设置为final是不正确的。

最后一件事:你用Spring吗?它有一个用于使用mongodb的完美库,与mongodb的工作非常类似于jpa功能。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59466114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档