Mongodb ODM: morphia

Mongodb-Morphia增删改查,分页查询,排序,去重查询 Mongodb-Morphia增删改查,分页查询,排序 阅读详情

Mongodb Java Driver

虽然Mongodb提供了java driver,但是如果我们直接使用driver进行mongodb的操作,代码冗余很多,使用不是方便,容易出错。这就像我们在RDBMS中使用sql直接操作数据库一样,大多数时候我们不提倡这样做,更多的时候我们使用MyBatis或者Hibernate做ORM。Mongodb中有这样的工具帮助我们完成ODM吗?

有很多,这里我们就介绍使用morphia作为ODM,因为它看起来比较清爽。https://github.com/mongodb/morphia


Learning Test

我们使用Learning Test的方式来演示我们如何使用Morphia,测试的方式可以参考《Java中的Mongodb单元测试》

为了方便,我创建了一个MorphiaBaseTest

public class MorphiaBaseTest extends MongodbBaseTest {
    protected Datastore datastore;

    @Before
    @Override
    public void setUp() throws Exception {
        super.setUp();
        datastore = new Morphia().createDatastore(mongo, db.getName());
    }
}

MongodbBaseTest见《Java中的Mongodb单元测试》。


最简单的ODM

我们首先完成一个User,这个User只有一个field是name,同时含有一个id作为唯一标示。

UserTest:

public class UserTest extends MorphiaBaseTest {
    @Test
    public void should_get_the_created_user() {
        final User user = new User("kiwi");
        datastore.save(user);

        final User userFromDb = datastore.get(User.class, user.getId());

        assertThat(userFromDb.getName(), is("kiwi"));
        assertThat(userFromDb.getId(), notNullValue());
    }
}


为了让Learning Test通过,对应的User

@Entity("users")
public class User {
    @Id
    private ObjectId id;
    private String name;

    //used for morphia
    User() {
    }

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public ObjectId getId() {
        return id;
    }
}

稍微解释一下,@Entity标示User的实例将会以document的方式存在db中对应的“users”这个collection中。@Id表示的是User中的id做为mongodb中user这个document的id。Morphia会自动去扫描它能发现的每一个field。所以name也会被存到数据库里。


Embedded Document

创建一个新的类:Contact

public class Contact {
    private String location;
    private String phoneNumber;

    //for morphia
    Contact() {
    }

    public Contact(String location, String phoneNumber) {
        this.location = location;
        this.phoneNumber = phoneNumber;
    }

    public String getLocation() {
        return location;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }
}


我们把Contact放在我们的User中:

@Entity("users")
public class User {
    @Id
    private ObjectId id;
    private String name;
    private Contact contact;

    User() {
    }

    public User(String name, Contact contact) {
        this.name = name;
        this.contact = contact;
    }

    //... ...

    public Contact getContact() {
        return contact;
    }
}


编写测试UserTest

    @Test
    public void should_get_user_contact() {
        final User user = new User("kiwi", new Contact("chengdu", "028-83003008"));

        datastore.save(user);

        final User userFromDb = datastore.get(User.class, user.getId());
        assertThat(userFromDb.getContact().getLocation(), is("chengdu"));
        assertThat(userFromDb.getContact().getPhoneNumber(), is("028-83003008"));
    }

通过,通过log你可以发现

insert embedded-mongo.users query: { _id: ObjectId('53c5f2c3ca50168dfc4d3362'), className: "org.kiwi.morphia.User", name: "kiwi",contact: { location: "chengdu", phoneNumber: "028-83003008" }}

在存储的过程中,contact已经被当做user的embedded document了。这是因为在morphia中,其对于对象的默认存储方式就是embedded document。你可以在contact上标明@Embedded,如下所示,效果都是一样的:

    @Embedded
    private Contact contact;


Reference

除了embedded外,还有还有一类比较重要的关系是reference。

创建Car:

@Entity("cars")
public class Car {
    @Id
    private ObjectId id;
    private String carNumber;
    private String brand;
    private int price;

    //for morphia
    Car() {
    }

    public Car(String carNumber, int price, String brand) {
        this.brand = brand;
        this.price = price;
        this.carNumber = carNumber;
    }

    public ObjectId getId() {
        return id;
    }

    public String getCarNumber() {
        return carNumber;
    }

    public String getBrand() {
        return brand;
    }

    public int getPrice() {
        return price;
    }
}

在User上增加对Car的引用(reference):

@Entity("users")
public class User {
    //... ...
    @Reference
    private Car car;

    //... ...

    public void addCar(Car car) {
        this.car = car;
    }

    public Car getCar() {
        return car;
    }
}

UserTest:

    @Test
    public void should_get_user_car() {
        final Car car = new Car("SC0404", 10000, "BMW");
        datastore.save(car);


        final User user = new User("kiwi", new Contact("chengdu", "028-83003008"));
        datastore.save(user);


        user.addCar(car);
        datastore.save(user);


        final User userFromDb = datastore.get(User.class, user.getId());
        assertThat(userFromDb.getCar().getCarNumber(), is("SC0404"));
        assertThat(userFromDb.getCar().getBrand(), is("BMW"));
        assertThat(userFromDb.getCar().getPrice(), is(10000));
    }

测试通过,标明Car在User中是一个reference对象的方法是@Reference。

此时存在数据库的User就是这样,car的类型是DBRef

{ "_id" : ObjectId("53c5fb68ca503473a3fabdc8"), "className" : "org.kiwi.morphia.User", "name" : "kiwi", "contact" : { "location" : "chengdu", "phoneNumber" : "028-83003008" },"car" : DBRef("cars", ObjectId("53c5fb68ca503473a3fabdc7")) }


总结

这里主要介绍了Morphia中常见的基本对象、Embedded Document以及Reference在Mongodb中是如何做ODM的。这篇博客中涉及到的代码:https://github.com/kiwiwin/morphia-demo


参考资料

http://www.obsidianscheduler.com/blog/using-mongodb-with-morphia/

http://architects.dzone.com/articles/using-morphia-map-java-objects

http://www.ibm.com/developerworks/java/library/j-morphia/

类似mybataisPlus的mongoDb的orm 阅读详情

相关推荐

MongoDB文档模型本质:从松散模式到聚合管道的数据治理哲学

文档数据库是一种以JSON-like结构为基本存储单元的NoSQL数据模型,其核心原理在于将业务实体封装为自包含、可索引、可部分更新的BSON文档,从而摆脱关系型数据库中预定义Schema与多表JOIN的刚性约束。这种设计赋予了系统天然的模式灵活性与水平扩展能力,技术价值体现在显著降低高频迭代场景下的数据演化成本——如电商SKU属性动态扩展、IoT设备字段实时新增等。典型应用场景包括内容管理系统、用户画像服务、实时分析看板及微服务间松耦合数据交换。本文深入解析MongoDB作为文档数据库代表的建模思想、聚合

weixin_34026276的博客 304

MongoDB基于Morphia (二)demo 包含聚合汇总 多条件查询

MongoDB基础语句 注:新增字段 也是用其中的set 但是确保实体类中有新增的属性(使用morphia) 例如:: books是表名 “book_serial_num” : “B1013687616857538560” 为筛选条件 mongo中语句 新增字段 如果原来有这个字段就是更新 db.getCollection(‘books’)...

My_Way666的博客 1956

ODM操作MongoDB

一、ODM的选择和安装 1.1、MongoDB中的ODM MongoEngine 使用最为广泛的ODM http://mongoengine.org/ uMongo 支持sync/async特性的ODM https://umongo.readthedocs.io/en/latest/ 1.2、MongoEngine的安装 MongoDB版本支持情况:v3.4、v3.6、v4.0 python版本支持情况:python3.6+ 安装:pip install mongoengine 1.3、连接到M

紫陌翌晨 830

技术调研--- 使用MyBatis连接 MongoDB,实现group by 等聚合查询

需要使用的组件 MongoDB BI Connector 简述 MongoDB 使用 BI Connector 来支持 BI 组件直接使用 SQL 或 ODBC 数据源方式直接访问 MongoDB,在早期 MongoDB 直接使用 Postgresql FDW 来实现 SQL 到 MQL 的转换,后来实现更加轻量级的 mongosqld 来支持 BI 工具的连接。 下载地址 https://www.mongodb.com/try/download/bi-connector 目录结构 mongodrdl

编码爱好者 9786

使用Morphia框架操作mongodb

使用Morphia框架操作mongodb

02.1 知识图谱工具 Protege的下载安装与使用

Protege的下载安装与使用 本文是王昊奋老师《知识图谱》系列笔记第2.1篇。 文章目录Protege的下载安装与使用0 相关介绍0.0 Protege相关介绍0.1 Protégé的特点0.2 Protégé的用途1 Protege的下载1.1 准备工作:安装配置JAVA环境1.2 官网下载2 Protege的安装2.1 直接解压缩2.2 双击运行3 Protege的使用实例-创建类...

和而不流 7万+

探索MongoDB的Java驱动利器:Morphia

是一个强大的开源Java数据映射(Object-Document-Mapper, ODM)框架,专为MongoDB设计。它简化了在Java应用程序中操作MongoDB数据库的过程,使得开发者可以更加专注于业务逻辑,而不是底层的存储细节。 ## 项目简介 Morphia 提供了一种简单的方式来将Java对象映射到MongoDB文档。通过提供类型安全的查询API和自动的数据持久化机制,它可以极大地

gitblog_00075的博客 965

单精度浮点数存储、双精度浮点数存储

单精度浮点数存储、双精度浮点数存储

fancynthia的博客 1305

MongoDB 的 ODM 框架查询方式,你知道哪些?

本文系统梳理了5款主流MongoDB ODM框架,分为通用生态框架和Java专属框架两大类。通用框架包括Node.js生态的Mongoose、TypeScript友好的Prisma和Python异步框架Beanie;Java专属框架推荐Spring Data MongoDB和轻量级Morphia。每款框架详细介绍了官方地址、核心功能、优缺点及适用场景,并给出选型建议:Java开发者首选Spring Data MongoDB或Morphia,Node.js/TypeScript项目可选Mongoose或Pri

键盘爱好者 624

光栅衍射有入射角时_偏振光栅的衍射角度及衍射效率测量

偏振光栅是一种基于入射光的偏振态实现选择性分光的衍射光学元件,衍射角度取决于光栅线数。通过控制入射光的偏振态,偏振光栅能够调控正一阶和负一阶之间的能量分布。当入射光束偏振态不同时,偏振光栅具有不同的衍射特性。理想的偏振光栅:当入射光为右旋圆偏振光时,只有+1级衍射光,衍射光为左旋圆偏振光。当入射光为左旋圆偏振光时,只有-1级衍射光,衍射光为右旋圆偏振光。当入射光为非圆偏振光时,偏振光栅同...

weixin_39552768的博客 6003

基于Lumerical FDTD的光栅耦合器宽带特性仿真与实验验证

本文详细介绍了基于Lumerical FDTD软件对光栅耦合器进行宽带特性仿真的完整流程。通过复现一个针对1310nm波段优化的经典光栅耦合器案例,文章从结构建模、光源设置、监视器布置到仿真运行与结果分析,逐步解析了如何准确模拟其耦合效率与带宽特性,并将仿真结果与实验数据进行对比验证,为硅光芯片的设计与优化提供了实用指导。

weixin_29294597的博客 511

Spring boot配置MongoDB以及Morphia踩坑记录

pom 因为项目中采用Morphia(MongoDB的ODM框架,对象-文档映射(object-document mapper)),因此需要在pom文件中引入相应依赖: <dependency> <groupId>dev.morphia.morphia</groupId> <arti...

821

车牌识别系统

随这图形图像技术的发展,现在的车牌识别技术准确率越来越高,识别速度越来越快。无论何种形式的车牌识别系统,它们都是由触发、图像采集、图像识别模块、辅助光源和通信模块组成的。车牌识别系统涉及光学、电器、电子控制、数字图像处理、计算视觉、人工智能等多项技术。触发模块负责在车辆到达合适位置时,给出触发信号,控制抓拍。辅助光源提供辅助照明,保证系统在不同的光照条件下都能拍摄到高质量的图像。图像预处理程序对抓拍的图像进行处理,去除噪声,并进行参数调整。然后通过车牌定位、字符识别,最后将识别结果输出。 牌照自动识别是一

FPGA/MATLAB学习教程/源码/项目合作开发 2万+

Morphia项目配置详解:从基础到高级

Morphia作为MongoDB的Java对象文档映射(ODM)工具,其配置方式在3.0版本发生了重要变化。最初版本主要采用编程式配置,而新版本转向了基于配置文件的声明式配置。这种转变主要基于以下考虑: 1. 更好地与Quarkus、Spring Boot等现代框架集成 2. 支持根据不同部署环境灵活调整配置 3. 在应用启动早期获取更多运行时信息,便于优化 ## 配置文件基础 Morphi

gitblog_00744的博客 537

【YOLOv11工业级实战】15. YOLOv11海洋监测实战:珊瑚礁健康评估(水下图像增强|机器人搭载)

摘要:本文针对珊瑚礁健康评估的海洋监测需求,基于YOLOv11提出解决方案,聚焦水下色偏、悬浮物干扰、珊瑚形态复杂三大难题。引用全球珊瑚礁监测网络(GCRMN)标准,采用CoralNet数据集,通过Jaffe-McGlamery物理模型引导增强与悬浮物去除算法,在浑浊水域(能见度<5m)实现87.3%的健康珊瑚识别率,藻类误判率低至7.2%。介绍了以BlueROV2水下机器人和Jetson AGX Orin为核心的部署方案,结合水下SLAM定位技术,实现珊瑚健康的实时评估与三维覆盖率计算。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1644

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型

一、本文介绍 本文记录的是基于 GhostNetV3 的 YOLOv11 轻量化改进方法研究。GhostNetV3的轻量模块采用重参数化方法,训练时为深度可分离卷积和1×1卷积添加线性并行分支,推理时通过逆重参数化移除分支、折叠操作,能够在不增加推理成本的同时提高性能,从而实现YOLOv11的轻量化改进。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进 专栏地址:YOLOv11改进专栏——以发表论文的角度,快速

Limiiiing的博客 1844

攻克Morphia查询难题:2025全API解析与性能调优实战

你是否还在为MongoDB Java驱动的冗长查询代码而烦恼?是否遇到过复杂业务场景下的查询性能瓶颈?作为MongoDB官方推荐的对象文档映射(ODM)框架,Morphia凭借类型安全的API和强大的查询构建能力,已成为Java开发者的首选工具。本文将系统剖析Morphia 3.x查询系统的底层架构,从基础过滤器到地理空间查询,从索引优化到执行计划分析,提供超过20个实战案例和性能调优指南,帮助你

gitblog_01013的博客 512

特征工程自动化(FeatureTools实战)

本项目模拟生成的医疗、金融和电商等领域的原始数据,适用于自动化特征工程的场景。主数据表(Entity Table):例如用户数据、交易数据、患者数据等。字段可能包括用户ID、年龄、性别、注册日期、消费金额、行为记录等。关联数据表(Related Tables):例如订单数据、点击记录、诊疗记录等。多个表之间通过外键建立关联。patient_id:患者IDage:年龄gender:性别:入院日期:出院日期diagnosis:诊断结果。

闲人编程的博客 1356

Morphia - Java 对象文档映射器教程

--- ## 1. 项目介绍 Morphia 是基于 [MongoDB Java 驱动](https://mongodb.github.io/mongo-java-driver/) 的对象文档映射(ODM)库。它简化了在 Java 应用中操作 MongoDB 数据的过程,通过提供一个高层次的 API 来实现 Java 对象与 MongoDB 文档之间的无缝转换。Morphia 设计目的是为了方

gitblog_01107的博客 1367

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Morphia项目中的文档更新操作详解

Morphia是一个优秀的Java对象文档映射(ODM)框架,用于简化MongoDB数据库操作。在Morphia 2.0及以上版本中,文档更新操作通过`Query`实例实现,这些更新操作直接在服务器端执行,无需将文档通过网络传输到客户端。本文将详细介绍Morphia中的各种更新操作方式及其应用场景。 ## 基本更新操作 ### 模型定义示例 首先我们定义一个酒店模型作为示例: ```jav

gitblog_00442的博客 420

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

MongoDB ODM Framework :MongoMongo-Simplifies your Storage

 MongoMongo is an Object-Document-Mapper (ODM) for MongoDB written in Java.  The philosophy of MongoMongo is to provide a familiar API to Java developers who have been using ActiveORM or Hibernate,...

allwefantasy的专栏 190

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深入Morphia:掌握实体生命周期方法的完整指南

在MongoDB Java开发中,你是否曾遇到过这些痛点:保存实体前需要手动更新时间戳、加载数据后必须执行额外初始化、复杂的状态校验逻辑散布在业务代码中?Morphia的实体生命周期方法(Lifecycle Methods)正是为解决这些问题而生。本文将系统讲解Morphia中4种核心生命周期注解、监听器实现模式以及12个实战场景,帮助你彻底摆脱重复编码,构建更优雅的数据访问层。 读完本文你将掌

gitblog_00543的博客 376

数据库 MongoDB ;对象文档模型(ODM)库 Mongoose;源码及笔记

数据库 MongoDB ;对象文档模型(ODM)库 Mongoose;源码及笔记

qq_42740465的博客 332

MongoDB的ORM框架——Morphia

1.引入pom <dependency> <groupId>org.mongodb.morphia</groupId> <artifactId>morphia</artifactId> <version>1.3.2</version> &l...

diaohan1348的博客 680

Buildah 中的 libseccomp-golang:Linux 系统调用过滤的 Go 绑定全解析

libseccomp-golang 是 Linux seccomp 系统调用过滤机制的 Go 语言绑定库,也是 Buildah 以 `--isolation=chroot` 方式安全运行容器内构建命令的底层依赖。本文以仓库中 vendored 的 [libseccomp-golang README](https://link.gitcode.com/i/0a7863c97fdba3412699c1

gitblog_00007的博客 461

MyBatis的集成与MongoDB

1.背景介绍 MyBatis是一款优秀的持久层框架,它可以使用XML配置文件或注解来定义数据库操作,从而实现对数据库的CRUD操作。MongoDB是一款高性能的NoSQL数据库,它使用BSON格式存储数据,支持文档模型。在某些场景下,我们可能需要将MyBatis与MongoDB集成,以实现更高效的数据访问。 在本文中,我们将讨论MyBatis与MongoDB的集成,包括背景介绍、核心概念与联系...

AI天才研究院 1896
上一篇: Java中的Mongodb单元测试
下一篇: Xtext Headless模式代码生成
kiwi小白
博客等级 码龄14年 153粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值