MongoDB ODM 框架MongoMongo-简化你的数据存储

2023-05-16

MongMongo是一个用Java写的ODM框架,使得对MongoDB的操作更加便捷。

 

MongoMongo努力为Java开发者提供类似于ActiveORM 或者 Hibernate的操作API,并且保留了MongoDB的schemaless,document-based 设计,动态查询,原子修改操作等特性。当然你可以很方便的绕开MongoMongo而使用Java Driver 原生提供的功能。

 

下面是一段示例代码:

 

 

public class Blog extends Document {
    static {
        storeIn("blogs");                
        hasManyEmbedded("articles", new Options(map(
                Options.n_kclass, Article.class
        )));
        //create index
        index(map("blogTitle", -1), map(unique,true));
        //validate uerName field
        validate("userName",map(length,map(
                minimum,5
        )));

    }
    //association related
    public AssociationEmbedded articles() {throw new AutoGeneration();}
    private String userName;
    private String blogTitle;
}

public class Article extends Document {
    static {        
        belongsToEmbedded("blog", new Options(map(
                Options.n_kclass, Blog.class
        )));
    }
    public AssociationEmbedded blog() {throw new AutoGeneration();}
    private String title;
    private String body;
}

public class Usage{
  public static void main(String[] args){

     Blog blog = Blog.where(map("userName","sexy java")).in(map("id",list(1,2,3))).singleFetch();
     blog.articles().build(map("title","i am title","body","i am body"));
     blog.save();
  }

}

 

 我们可以看到这是一个典型的充血模型。关联,存储,创建索引,设置别名等操作都简单的在static 块中调用一个函数即可实现。如果你用一些动态语言,你会发现这种方法级声明语法是非常流行,写起来也非常舒服。

 

其实对于MongoDB相关的框架已经有很多,那么MongoMongo的优势何在?我们简单做个代码对比就一目了然了。

 

以 SpringData for MongoDB为例,典型的操作如下:

 

 public static void main( String[] args )
    {
        MongoOperations mongoOps = new MongoTemplate(new Mongo(), "mydb");
        Person person = new Person();
        person.setName("Joe");
        person.setAge(10);
        mongoOps.insert(person);
        log.info(mongoOps.findOne(new Query(Criteria.where("name").is("Joe")), Person.class));
    }

 

 

 

事实上大部分Java ODM都是如此操作Model的。为了构造查询串引入Criteria对象,为了进行查询引入Query对象,查询时还要申明Person对象等。

此外对于索引,别名,校验等设置也较为繁琐和不清晰,通常将将这些信息放在字段的Annotation上,或者设置一些Configuration对象等。

而MongoMongo将大部分对collection的配置都放在Model的代码块中,清晰明了,且便于管理。

 

相应的MongoMongo代码

 

public static void main( String[] args )
 {
     Person person =  Person.create(map("name","Joe","age",34));
     person.save();
     log.info(Person.where(map("name","Joe")).singleFetch()); 
 }

 

 

 

MongoMongo的查询也是典型的ORM的操作方式。

 

Blog blog = Blog.where(map("active",true)).in(map("id",list(1,2,3))).singleFetch();

 

通常你还可以写成:

public class Blog extends Document {
   public Criteria active(){
    return where(map("active",true));
   } 
}

 

之后你就可以这样调用:

List<Blog> blogs = Blog.active().where(map("userName","jack")).fetch();

 

复用性是很高的。

如果你使用过 ActiveORM,那么这样操作MongoDB 你会感觉很顺手。

MongoMongo目前在一些内部小项目中使用。根据需求定制的,所以相对来说没有 ActiveORM 完善,很多细节和功能没有考虑到,但是都可以通过其暴露的MongoDB Driver 解决。

 

举个例子:

 

TTUser.collection().find(new BasicDBObject("tagName","cool"));

 

这个时候你尅通过collection()方法获得DBCollection对象。

 

当然也希望以后能遇到一个复杂的项目,从而能在该项目中完善MongoMongo.

如果你将它用在自己的项目中,我想肯定能节约相当多的代码。

 

大家不妨根据 5 steps to run a application on MongoMongo  体验下。

 

 

 

 

 

 

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

MongoDB ODM 框架MongoMongo-简化你的数据存储 的相关文章

  • 使用栈模拟递归的算法

    这一篇笔者要讲的是如何用栈来模拟递归 xff0c 或者说替代递归的算法 xff0c 现在我们假如要算从三角形数的叠加 xff0c 比如输入10 xff0c 输出是55 xff0c 输入是100 xff0c 输出是5050 xff0c 等等
  • java集合篇(一)——ArrayList扩容原理

    相信大家都对ArrayList相当熟悉了 xff0c 今天笔者就对ArrayList的源码进行解读 xff0c 讲解一下对ArrayList扩容的基本原理 虽然大家都有用过 xff0c 但还是简单介绍一下吧 xff0c ArrayList实
  • 怎样快速开发一个 Dubbo 应用?

    背景 本文将以 Dubbo 为例 xff0c 介绍如何快速开发一个 Dubbo 应用 为了便于读者理解 xff1a 首先会介绍一下传统的 RMI 的基本概念 然后比较下现代的 RPC 框架与 RMI 的区别 再基于 Dubbo 提供的 AP
  • 百度历届笔试题(1)

    题目描述 牛牛和妞妞正在玩一个猜数游戏 xff0c 妞妞心里想两个不相等的正数 xff0c 把这两个正数的和y告诉牛牛 妞妞声称这两个数都不超过x xff0c 让牛牛猜这两个数是多少 牛牛每猜一次 xff0c 妞妞会告诉他猜对了还是猜错了
  • systemd service 配置自启动,配置多个环境变量,最大打开文件数

    一 创建service文件 样例 vim usr lib systemd system nacos service Unit Description 61 nacos After 61 network target Service Type
  • IntelliJ IDEA 架构概述(面向插件开发者)

    原文未定稿 2014 11 这篇文章的目的是从插件开发者的视角描述IntelliJ IDEA的结构 文章将以一种任务驱动的方式组织 xff1a 相比列出所有你可以对各组件对象进行的操作并描述这些操作它们的实现方式 xff0c 这篇文章将尽可
  • 用大数据思维做运维监控

    今天一大早就看到了一篇文章 xff0c 叫 大数据对于运维的意义 该文章基本上是从三个层面阐述的 xff1a 工程数据 xff0c 譬如工单数量 xff0c SLA可用性 xff0c 基础资源 xff0c 故障率 xff0c 报警统计业务数
  • 仿滴滴抢单倒计时的Demo

    滴滴里面有一个下单完成之后等待界面的倒计时转圈的视图 就是这个 原理 xff1a 通过CAShapeLayer层添加到自己自定义的视图layer上 设置ShapeLayer的path 他的路劲绘制一般通过UIBezierPath配合设置 通
  • iOS开发之自己封装的提示框(警告框)样式BHAlertView

    最近需要使用到提示框 xff08 警告框 xff09 进行信息的展示和提醒 xff0c 所以进行了一个类的封装 xff0c 想用Swift调用此OC文件 xff0c 但是发现有些困难 xff0c 所以暂时先把OC代码进行展示 xff0c 随
  • 使用ActiveMQ进行C++与C#的通信

    该系列文章介绍如何通过ActiveMQ在C 43 43 和C 控制台项目之间通信 关于ActiveMQ的介绍可以参考 深入浅出ActiveMQ xff0c 平台搭建可以参考 Activemq 平台搭建与C 示列 xff0c 两者之间有交叉内
  • Centos8防火墙设置

    进程与状态相关 systemctl start firewalld service 启动防火墙 systemctl stop firewalld service 停止防火墙 systemctl status firewalld 查看防火墙状
  • c/c++笔试

    1 xff0e 进程和线程的差别 线程是指进程内的一个执行单元 也是进程内的可调度实体 与进程的区别 1 调度 xff1a 线程作为调度和分配的基本单位 xff0c 进程作为拥有资源的基本单位 2 并发性 xff1a 不仅进程之间可以并发执
  • android onNewIntent 调用时机

    当前Activity已经在Activity堆栈当中时 xff0c 主要取决于LaunchMode对应的设置 LaunchMode为SingleTop时 xff0c 如果ActivityA在栈顶 且现在要再启动ActivityA xff0c
  • 不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式

    不知道怎么开发VR游戏 xff1f Unity5 3官方VR教程重磅登场 系列3 VR中的交互方式 王寒 4 个月前 https zhuanlan zhihu com p 20505470 概览 xff1a 在VR项目中 xff0c 我们需
  • Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”

    想利用传统的线程通信wait notify xff0c notifyAll 方法 xff0c 必须依赖于同步监听器的存在 xff0c 也就是说 xff0c 对于synchronized修饰的同步方法 xff0c 因为该类的默认实例 xff0
  • java TCP/IP实现简单的多人聊天功能

    TCP IP是可靠的网络协议 xff0c 数据的传输需要服务端和客户端之间三次 握手 xff0c 比较适合文本等一些可靠性要求高的数据传输 xff0c 但是它的效率较UDP低 下面通过一张图来简要说明使用 ServerSocket 创建 T
  • JavaScript开发工具WebStorm使用教程:从命令行运行代码检查

    从命令行运行代码检查 WebStorm运行代码检查可以发现并突出显示语法错误 死代码 可能的错误 错误的编码风格和其他问题 还可以从命令行为特定项目运行所有已配置的检查 xff0c 并将结果存储为 XML JSON 或带有报告的纯文本文件
  • 基于Spark的机器学习经验

    这篇内容基于我去年的一些感悟写的 xff0c 但是今年才在Stuq 的微信群做的分享 从技术角度而言 xff0c 对Spark的掌握和使用还是显得很手生的 但是今天一位做数据分析相关的朋友说 xff0c 受这篇内容影响 xff0c 他接受了
  • Linux(manjaro)微信web开发者工具

    安装 wine和winetricks span class hljs built in sudo span pacman S wine winetricks 打开winetricks 安装需要的组件 安装linux版本运行程序 github
  • C++类与对象

    C 43 43 面向对象 一 面向对象程序设计方法概述 1 凡是以类对象为基本构成单位的程序称为基于对象的程序 2 面向对象和面向过程的区别 xff1a 在笔者看来 xff0c 通俗地讲 xff0c 面向对象 就是在描述一个对象 xff0c

随机推荐

  • SVN无法提交修改问题

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • AbstractApplicationContext.refresh()应用上下文刷新方法

    前情提要 学习源码光看博客文章基本没有记住的可能 结合源码和博客 43 实践才能够通过理解记住 看了很多天才断断续续看完 发现它和其他IOC Bean生命周期都有关联 将之前片段式的认知串联起来了 这个刷新的代码很长 建议没耐心的时候就先不
  • IIC协议--简要理解

    1 iic协议是什么 xff1f IIC Inter xff0d Integrated Circuit 总线是一种由 PHILIPS 公司开发的两线式串行总线 xff0c 用于连接微控制器及其外围设备 它是由数据线 SDA 和时钟 SCL
  • RISC与CISC比较

    RISC的设计重点在于降低由硬件执行指令的复杂度 xff0c 因为软件比硬件容易提供更大的灵活性和更高的智能 xff0c 因此RISC设计对编译器有更高的要求 xff1b CISC的设计则更侧重于硬件执行指令的功能 xff0c 使CISC的
  • 操作系统选择调度方式和算法的若干准则

    1 调度的类型 按调度的层次 xff1a 长期 xff08 长程 作业 高级 xff09 调度 xff1b 中期 xff08 中级 中程 xff09 调度 xff1b 短期 xff08 短程 进程 低级 xff09 调度 按OS 的类型 x
  • 提灯过桥问题

    题目 xff1a 小明一家过一座桥 xff0c 过桥时是黑夜 xff0c 所以必须有灯 现在小明过桥要1秒 xff0c 小明的弟弟要3秒 xff0c 小明的爸爸要6秒 xff0c 小明的妈妈要8秒 xff0c 小明的爷爷要12秒 每次此桥最
  • 如何判断一个整数数组中是否有重复元素

    题目 xff1a 写一个函数判断一个int类型的数组是否是有效的 所谓有效是指 xff1a 假设数组大小为n xff0c 那么这个int数组里的值为0 n 1之间的数 xff0c 并且每个数只能出现一次 xff0c 否则就是无效数组 例如
  • 2014百度校招开发测试工程师笔试题

    时间 xff1a 2013 9 28 地点 xff1a 深圳 职位 xff1a 开发测试工程师
  • Spark Streaming + Spark SQL 实现配置化ETL流程

    Spark Streaming 非常适合ETL 但是其开发模块化程度不高 xff0c 所以这里提供了一套方案 xff0c 该方案提供了新的API用于开发Spark Streaming程序 xff0c 同时也实现了模块化 xff0c 配置化
  • 整体了解HADOOP框架及一些开源项目

    Hadoop框架中 xff0c 有很多优秀的工具 xff0c 帮助我们解决工作中的问题 Hadoop的位置 从上图可以看出 xff0c 越往右 xff0c 实时性越高 xff0c 越往上 xff0c 涉及到算法等越多 越往上 xff0c 越
  • Kafka简介

    Kafka简介 在当前的大数据时代 xff0c 第一个挑战是海量数据的收集 xff0c 另一个就是这些数据的分析 数据分析的类型通常有用户行为数据 应用性能跟踪数据 活动数据日志 事件消息等 消息发布机制用于连接各种应用并在它们之间路由消息
  • Flume入门笔记------架构以及应用介绍

    在具体介绍本文内容之前 xff0c 先给大家看一下Hadoop业务的整体开发流程 xff1a 从Hadoop的业务开发流程图中可以看出 xff0c 在大数据的业务处理过程中 xff0c 对于数据的采集是十分重要的一步 xff0c 也是不可避
  • 分布式服务框架dubbo原理解析

    alibaba有好几个分布式框架 xff0c 主要有 xff1a 进行远程调用 类似于RMI的这种远程调用 的 dubbo hsf xff0c jms消息服务 napoli notify xff0c KV数据库 tair 等 这个框架 工具
  • Android Studio Gradle project Sync Failed解决方法

    1 查看项目使用的gradle和本地gradle是否一致 本地gradle一般目录在C Users admin gradle文件夹下面 项目使用的gradle在项目的gradle wrapper properties文件中 distribu
  • Docker not running on windows 10 error: Hardware assisted virtualization and data execution protecti

    Docker not running on windows 10 error Hardware assisted virtualization and data execution protection must be enabled in
  • [高通SDM450][Android9.0]user版本uartlog常开

    文章目录 开发平台基本信息问题描述解决方法user版本调试串口可输入user版本uartlog常开 开发平台基本信息 芯片 SDM450 版本 Android 9 0 kernel msm 4 9 问题描述 user版本调试串口默认只输入调
  • Ubuntu 7.04 乱码解决

    一 解决XMMS乱码问题 菜单乱码的解决 1 sudo ln s etc gtk gtkrc zh CN etc gtk gtkrc zh CN utf 8 2 sudo gedit etc gtk gtkrc zh CN utf 8 填写
  • yii2连接websocket服务实现服务端主动推送消息给客户端

    上一篇写的是websocket的服务 xff0c 这一篇写写调用服务和web端调用 xff0c 接收消息部分 1 调用websocket服务 主动推送消息的方法 lt php namespace common services use co
  • 生产者消费者算法

    span class hljs comment include lt unistd h gt span span class hljs comment include lt stdlib h gt span span class hljs
  • MongoDB ODM 框架MongoMongo-简化你的数据存储

    MongMongo是一个用Java写的ODM框架 xff0c 使得对MongoDB的操作更加便捷 MongoMongo努力为Java开发者提供类似于ActiveORM 或者 Hibernate的操作API 并且保留了MongoDB的sche