Spring Data MongoDB - 忽略空对象

2023-12-11

我使用 Spring Data 和 MongoDB 来保存一些文档。保存文档时,我希望 Mongo 不包含空对象。 (如何)可以实现这一目标?

假设我有以下主类:

@Document(collection = "main_doc")
public class MainDoc {
    @Id
    private String id;

    private String title;
    private SubDoc subDoc;
}

包含以下类的对象:

public class SubDoc {

    private String title;
    private String info;

}

现在,如果我尝试保存以下对象:

MainDoc main = new MainDoc();
main.setTitle("someTitle");
main.setSubDoc(new SubDoc());

注意:实际上我无法控制 SubDoc 是这样设置的。它可以是空的,也可以是填充的。我想要的是,如果一个元素的属性/字段都是NULL,它根本不会存储在mongo中。 这会在 mongo 中产生类似这样的结果:

{
    "_id" : "5a328f9a-6118-403b-a3a0-a55ce52099f3",
    "title": "someTitle",
    "subDoc": {}
}

我想要的是,如果一个元素仅包含 null 属性,则它们根本不会保存,因此对于上面的示例,我希望得到以下结果:

{
    "_id" : "5a328f9a-6118-403b-a3a0-a55ce52099f3",
    "title": "someTitle"
}

文档的保存是在存储库的帮助下完成的,如下所示:

@NoRepositoryBean
public interface MainRepo extends CrudRepository<MainDoc, String> {

    // save inherited

}

提前致谢。


您在这里可以做的一件事是编写自定义转换器MainDoc:

public class MainDocConverter implements Converter<MainDoc, DBObject> {
    @Override
    public DBObject convert(final MainDoc source) {
        final BasicDbObject dbObject = new BasicDBObject();
        ...
        if(/* validate is subdoc is not null and not empty */) {
            dbOject.put("subDoc", source.getSubDoc());
        }
    }
}

您可以将其注册在@Configuration文件例如:

@Configuration
@EnableMongoRepositories(basePackages = {"package"})
public class MongoConfig {

    private final MongoDbFactory mongoDbFactory;

    public MongoConfig(final MongoDbFactory mongoDbFactory) {
        this.mongoDbFactory = mongoDbFactory;
    }

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {

        final MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, getDefaultMongoConverter());
        return mongoTemplate;

    }

    @Bean
    public MappingMongoConverter getDefaultMongoConverter() throws Exception {

        final MappingMongoConverter converter = new MappingMongoConverter(
                new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext());
        converter.setCustomConversions(new CustomConversions(Arrays.asList(new MainDocConverter())));

        return converter;
    }

}

如果您不想为您的对象玩具编写自定义转换器,可以使用默认转换器并对其进行一些修改。

final Document document = (Document) getDefaultMongoConverter().convertToMongoType(mainDoc);

if(/* validate is null or is empty */) {
    document .remove("subDoc");
}

mongoTemplate().save(document);

其实这不是最好的方法。正如人们所写的那样,空对象应该存储为{},但转换器可以帮助您解决问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data MongoDB - 忽略空对象 的相关文章

随机推荐

  • “304 Not Modified”到底是如何工作的?

    304 Not Modified 响应是如何生成的 浏览器如何判断HTTP请求的响应是否为304 是浏览器设置的还是服务器发送的 如果由服务器发送 服务器如何知道缓存中可用的数据 以及如何将304设置为图像 我的猜测 如果它是由浏览器生成的
  • Git pre-commit hook:使用 -a 标志提交时如何获取添加/修改的文件

    当我使用 git commit a 提交我的工作时 预提交挂钩中的 git diff diff filter ACM name only cached 无法获取 git 将添加的文件 那么对于这种情况 正确的解决方案是什么 这里的问题是gi
  • 如何禁用/启用对话框负积极按钮?

    请查看下面的自定义对话框 我在对话框上有一个编辑文本字段 如果文本字段为空 我想禁用positiveButton 我可以为文本字段获取 charListener 但我不确定如何设置positivebutton禁用或启用该侦听器 正负按钮的参
  • Apache Flink:如何在摄取时间模式下获取事件的时间戳?

    我想知道是否可以使用Flink的摄取时间模式来获取记录的时间戳 考虑以下 flink 代码示例 https github com apache flink blob master flink examples flink examples
  • 在启用安全管理命令后,Glassfish 5 将无法启动

    输入enable secure admin 命令后 我无法运行 Glassfish 5 我有明确的操作系统 Ubutntu 服务器 16 04 然后我安装 java 8 并下载 zip 文件中的 glassfish 服务器 可能是什么问题呢
  • 如何使用 Graph-API 在 Facebook 中搜索特定位置的所有用户

    我有一个项目 我必须在 Facebook 上搜索所有人 特定位置 然后对数据应用进一步的过滤器 我的问题和问题是 如何使用 Graph API 获取初始数据 我知道这是可能的 使用 Facebook 本身的搜索字段 只需输入 所有居住在 的
  • 如何使用表面视图在用户不知情的情况下捕获图像?

    我想从 Android 相机捕获图像 但用户不知情 public class Capture extends Activity public Uri fileUri public String filepath1 public static
  • doGet 方法完成后 Servlet 是否返回响应?

    显然 doGet方法的返回类型为 void 因此 它不返回任何内容 从这个意义上说 我使用 返回 一词来表示将响应发送回请求它的客户端 我正在尝试实现一个长轮询 Servlet 在我有想要发回的内容之前不发送响应是有益的 因此 在 doGe
  • 我怎样才能让它在 android/iphone 上播放视频?

    update 1 我不太了解 但我想做的是通过 html5 在 android 手机上播放视频 正如其他人所说 我必须使用标签才能做到这一点 结束更新1 updated 这是我的 html 页面上的代码
  • 如何获取我的程序中单击的每个按钮的索引?

    所以我有一个双按钮数组 单击按钮后 我需要能够获取它的索引以用于进一步编码 这是一个类似扫雷的游戏 这是我到目前为止的代码 我有一个双 for 循环来为每个按钮创建一个 Handle 事件 但我不知道如何获取每个按钮的索引 我尝试过 e g
  • UINavigationBar 与 UISegmentedControl 部分覆盖 childViews

    我已经阅读了有关此内容和 Apple 文档的许多其他主题 但尚未找到针对我的特定问题的解决方案 我的应用程序使用UITabBarController as the rootViewController 在其中一个选项卡中我有一个UISegm
  • 迭代器内的元素发生变化

    我想迭代作为成员包含在名为的结构中的向量内的一些元素Test 想法是要变异的Test在每次迭代中都是独立的 如果每次迭代中的某些外部逻辑发生变化 则表示成功Test是成功的 为简单起见 突变只是将向量元素更改为123u8 我遇到的问题是无法
  • 虚拟化 WrapPanel

    WPF 4 是否还包含虚拟化 WrapPanel 或者是否可以轻松地从现有面板派生一个虚拟化 WrapPanel 我想做一个像 Outlook 那样的地址视图 我认为不可能实现具有完全虚拟化的 WrapPanel 在两个方向上 但请检查一下
  • PowerShell - 脚本 1 调用脚本 2 - 如何将值从脚本 2 返回到脚本 1

    我有两个 PowerShell 脚本 一个脚本使用提升的凭据调用另一个 PowerShell 脚本 使用启动进程 但我正在努力解决如何使第二个脚本将输出值返回到第一个脚本 这是脚本 1 使用 script1 psl sender ip 10
  • 去除JS数据结构中的一层嵌套数组

    如何转换以下数据结构 var data time 1 speed 20 to var data time 1 speed 54 我只想删除数组 由于数据是一个数组 您只需选择外部数组的第一个元素 所以解决方案是 var data time
  • 按下或禁用时不要更改 NSButton 的外观

    我有两个 NSButton 其中包含打开状态和关闭状态的图像 一次只能有一个人处于活动状态 单击一个 然后单击另一个以来回更改属性 问题是 如果我在单击按钮时禁用它 以便无法再次单击它 则禁用按钮时图像会变暗 而且我不希望它变暗 我只想使用
  • 如何引用 Lambda?

    我怎样才能推荐Lambda从它的内部 例如 如果我需要使用myLambda递归地 myLambda gt expression how can I refer to myLambda here 如果您的意思是要引用您正在定义的 lambda
  • 如何验证 MM/dd/yyyy hh:mm 格式的日期时间?

    我正在使用 MaskedEditExtender 输入日期时间 我无法弄清楚如何验证它 是否有任何正则表达式用于验证日期和时间 MM dd yyyy hh mm 或任何 JavaScript 函数 这将解决您的问题 0 1 9 1 0 2
  • 如何使用 php 在后台(非阻塞)运行程序?

    我想在php中运行一个shell脚本 但是这个shell脚本需要很长时间才能执行 它有睡眠 我不希望Web服务器在执行这个脚本时阻塞 我试过exec and shell exec 在 php 中 但服务器停止直到 shell 脚本完成 我想
  • Spring Data MongoDB - 忽略空对象

    我使用 Spring Data 和 MongoDB 来保存一些文档 保存文档时 我希望 Mongo 不包含空对象 如何 可以实现这一目标 假设我有以下主类 Document collection main doc public class