文档章节

tangyuan-mongo,使用SQL语法访问MongoDB

x
 xson_org
发布于 2017/08/17 16:53
字数 1465
阅读 344
收藏 31
点赞 0
评论 5

1. 介绍

tangyuan-mongo是tangyuan框架中的MONGO服务组件,tangyuan-mongo组件将一系列的Mongo操作封装成Tangyuan中的服务,并提供统一的方式进行访问;同时还提供以SQL语法的方式访问Mongo。

示意图

项目源码:https://github.com/xsonorg/tangyuan2/

官网地址:http://xson.org/

2. 使用SQL语法访问Mongo

如果我们要查询性别为女性,年龄在18岁到28岁之间的用户,如果使用Mongo原始的语法,我们需要这样写:

db.user.find({"gender":"Female", "age":{"$gte":18, "$lte":28}})

现在,我们可以使用下面的方式:

select * from user where gender = 'Female' and age >= 18 and age <= 28

是不是感觉就像SQL查询?是的没错,tangyuan-mongo就是提供以SQL语法的方式访问Mongo。

3. 支持的SQL语法

3.1 插入

语法

INSERT INTO
    tbl_name (col_name,...)
    VALUES (col_value,...)

示例

INSERT INTO user_info(id, name, age, amount) VALUES(1, 'xsonorg', 18, 1000);

解析后Mongo语法

db.user_info.insert({ "id" : 1 , "name" : "xsonorg" , "age" : 18 , "amount" : 1000})

3.2 查询

语法

SELECT
    {col_name | expr}, ...
    [FROM tbl_name
    [WHERE where_definition]
    [ORDER BY col_name [ASC | DESC] , ...]
    [LIMIT {[offset,] row_count}]

示例

SELECT * from user_info where age >= 18 and age <= 28 order by age limit 10

解析后Mongo语法

db.user_info.find({ "age" : { "$gte" : 18 , "$lte" : 28}}).sort({"age" : 1}).limit(10)

3.3 更新

语法

UPDATE tbl_name
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]

示例

UPDATE user_info SET name = 'xson.org', age = age + 2 where id = 1

解析后Mongo语法

db.user_info.update({ "id" : 1} , { "$set" : { "name" : "xson.org"} , "$inc" : { "age" : 2}}, false, true );

3.4 删除

语法

DELETE FROM tbl_name
    [WHERE where_definition]

示例

delete from user_info where user_id = 1

解析后Mongo语法

db.user_info.remove({ "id" : 1})

4. Mongo服务

第三章中对支持的SQL语法做了说明,本章中,我们会进一步介绍如何基于SQL语句,来定义Mongo服务,以及Mongo服务的使用。

首先,什么是Mongo服务?Mongo服务的本质是tangyuan中的提供MongoDB操作的服务,包含了一系列的SQL语句和XML标签,在用户访问Mongo服务的时候,框架会将SQL语句解析成MONGO语法,通过解析后的Mongo语法来操作MongoDB,并返回结果。

下面我们来看一个完整的示例:

4.1 完整的示例

a. 增加依赖的Jar

<dependency>
    <groupId>org.xson</groupId>
    <artifactId>tangyuan-mongo</artifactId>
    <version>1.2.0</version>
</dependency>

<dependency>
	<groupId>org.mongodb</groupId>
	<artifactId>mongo-java-driver</artifactId>
	<version>3.3.0</version>
</dependency>

b. 添加服务组件

在tangyuan总配置文件(tangyuan.xml)中添加mongo组件:

<?xml version="1.0" encoding="UTF-8"?>
<tangyuan-component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="http://xson.org/schema/tangyuan/component.xsd">
	
	<!--添加Mongo服务组件 -->
	<component resource="component-mongo.xml" type="mongo" />
	
</tangyuan-component>

c. 配置组件

tangyuan-mongo组件本身的配置(component-mongo.xml):

<?xml version="1.0" encoding="UTF-8"?>
<mongo-component xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="http://xson.org/schema/tangyuan/mongo/component.xsd">
	
	<!-- Mongo数据源 -->
	<dataSource id="mongods">
		<property name="url" value="mongodb://127.0.0.1:27017/mdb" />
	</dataSource>
	
	<!-- Mongo服务插件 -->
	<plugin resource="test-mongo.xml"/>
	
</mongo-component>

d. 编写Mongo服务

在服务插件(test-mongo.xml)文件中定义Mongo服务:

<?xml version="1.0" encoding="UTF-8"?>
<mongoservices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="http://xson.org/schema/tangyuan/mongo/service.xsd" ns="demo">

	<!-- Mongo查询服务 -->
	 <selectOne id="getUser" dsKey="mongods">
	 	SELECT * from user_info where id = 1
	 </selectOne>
	
</mongoservices>

e. 单元测试

[@Test](https://my.oschina.net/azibug)
public void testMongo() {
	XCO request = new XCO();
	// set
	Object obj = ServiceActuator.execute("demo/getUser", request);
	System.out.println(obj);
}

f. 返回结果

当前服务getUser返回的结果是一个XCO对象,其XML格式表示如下:

<?xml version="1.0" encoding="UTF-8"?>
<X>
	<S K="_id" V="59950f7f2932a11a68285d21"/>
	<I K="id" V="1"/>
	<S K="name" V="xson.org"/>
	<I K="age" V="26"/>
	<I K="amount" V="1000"/>
</X>

通过之前的步骤,我们实现了一个完整的流程,从组件的配置、服务的定义到服务的调用。在上述示例中我们演示了Mongo查询服务,其实在tangyuan-mongo中,还支持其他几种Mongo服务,下面我们会依次介绍。注意一点:所有的Mongo服务都需要在服务插件文件中定义,比如示例中的test-mongo.xml文件,下面示例中将不再特别说明。

4.2 MONGO查询服务,查询一个结果集

<selectSet id="getUserList" dsKey="mongods"><![CDATA[
	SELECT * from user_info where age >= 18 and age <= 28 order by age limit 10
 ]]></selectSet>

MONGO查询结果集服务是通过selectSet标签进行定义的。返回的是一个List<XCO>对象.

4.3 MONGO查询服务,查询一条记录

 <selectOne id="getUser" dsKey="mongods">
 	SELECT * from user_info where id = 1
 </selectOne>

MONGO查询单条记录服务是通过selectOne标签进行定义的。返回的是一个XCO对象.

4.4 MONGO查询服务,查询一个字段

 <selectVar id="getUserName" dsKey="mongods">
 	SELECT name from user_info where id = 1
 </selectVar>

MONGO查询字段服务是通过selectVar标签进行定义的。返回的是该字段对应的具体类型。

4.5 MONGO插入服务

<insert id="addUser" dsKey="mongods">
	INSERT INTO user_info(id, name, age, amount) VALUES(1, 'xsonorg', 18, 1000);
</insert>

MONGO插入服务是通过insert标签进行定义的,用作于插入一个文档。返回值为该文档的_id值,String类型。

4.6 MONGO更新服务

<update id="updateUser" dsKey="mongods"><![CDATA[
	UPDATE user_info SET name = 'xson.org', age = age + 2 where id = 1
 ]]></update>

MONGO更新服务是通过update标签进行定义的,用作于更新文档。返回值为影响行数,Integer类型。

4.7 MONGO删除服务

 <delete id="deleteUser" dsKey="mongods">
 	delete from user_info where id = 2
 </delete>

MONGO删除服务是通过delete标签进行定义的,用作于文档的删除。返回值为影响行数,Integer类型。

4.8 MONGO组合服务

 <mongo-service id="opUser" dsKey="mongods">
	<insert>
		INSERT INTO user_info(id, name, age, amount) VALUES(2, 'tangyuan-mongo', 18, 1000);
	</insert>	 
 	<update><![CDATA[
		UPDATE user_info SET name = 'xson.org', age = age + 2 where id = 1
	 ]]></update>
	<selectSet resultKey="{users}"><![CDATA[
		SELECT * from user_info where age >= 18 and age <= 28 order by age limit 10
	 ]]></selectSet>
	 <return>
	 	<property value="{users}"/>
	 </return>
 </mongo-service>

MONGO组合服务是通过mongo-service标签进行定义的,用作于将多个Mongo基本服务封装成一个新的服务,供用户访问。返回对象可通过return标签定义。

结语

通过本文的内容,我们对于tangyuan-mongo组件有了初步的了解,如果您对此感兴趣的话,可以通过下面的连接地址,进一步详细的了解该组件的使用。

tangyuan-mongo技术文档:http://www.xson.org/project/mongo/1.2.0/

© 著作权归作者所有

共有 人打赏支持
x
粉丝 19
博文 22
码字总数 34888
作品 5
海淀
加载中

评论(5)

Miyako
Miyako
mark
跳蚤
跳蚤
mongo有自己的查询语法,为什么要转成sql
我觉得没必要
红薯
红薯

引用来自“红薯”的评论

代码在码云来一下? 我们推荐下:)

引用来自“xson_org”的评论

感谢红薯,此代码已更新码云。
https://gitee.com/xsonorg/tangyuan2
已在码云推荐:)
x
xson_org

引用来自“红薯”的评论

代码在码云来一下? 我们推荐下:)
感谢红薯,此代码已更新码云。
https://gitee.com/xsonorg/tangyuan2
红薯
红薯
代码在码云来一下? 我们推荐下:)
在 EMR 中使用 Mongo-Hadoop

在 EMR 中使用 Mongo-Hadoop Mongo-Hadoop 是 MongoDB 推出的用于 Hadoop 系列组件连接 MongoDB 的组件。其原理跟我们上一篇文章介绍的 ES-Hadoop 类似。EMR 中已经集成了 Mongo-Hadoop,用户...

xy_xind
06/22
0
0
Mongodb GridFS图片文件存储解决方案

Mongodb GridFS图片文件存储解决方案 之前解决方案是接收图片数据后,将图片直接存储到盘阵,然后通过Apache做服务器,将图片信息存储到数据库,并且存储一个Apache的访问路径。 目前需要后台...

一枚Sir
2014/06/19
0
0
MongoDB 3.4.2 SQL 查询语句详解

本文对 MongoDB 的一些基本操作做一下整理和总结。 首先会介绍一下基于命令行的sql操作,其次结合 spring 的 mongoTemplate 介绍一下如何通过 java 操作数据库。对 NoSQL 不熟悉的同学可以了...

gaob2001
05/24
0
0
NoSql: MongoDB简介

真理局限性:没有任何工具能应对所有问题 没有任何一个数据库能满足所有的应用场景   MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储...

Bingo许
2012/11/30
0
0
linux下mongodb的安装

一、linux下mongodb的安装 访问Mongodb 官网,http://www.mongodb.org/downloads进入下载页面。 下载mongodb-linux-x8664-2.4.12.tar。 使用FTP 工具将mongodb 的安装包上传到Linux 服务器。...

micical
2015/10/29
0
0
MongoDB介绍及下载与安装

一、MongoDB介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储...

BravoZu
2014/01/19
0
0
MongoDB 基本操作与MongoDB for JAVA

一、准备工作 1、 下载mongoDB 下载地址:http://www.mongodb.org/downloads 选择合适你的版本 相关文档:http://www.mongodb.org/display/DOCS/Tutorial 2、 安装mongoDB A、 不解压模式: ...

IT_小翼
2013/08/07
0
1
PHP程序员应了解MongoDB的五件事

2010年应该被人们记住,因为SQL将在这一年死去。这一年关系数据库行将就木,这一年开发者发现他们再不需要长时间辛苦的构造列或者表格来存放数据。 2010年将是文档型数据库的起始年。尽管这样...

五味格子
2011/05/11
0
0
MongoDB集群部署(副本集模式)

一、需求背景 1、现状描述 (1)、针对近期出现的mongodb未授权的安全问题,导致mongodb数据会被非法访问。应安全平台部的要求,需要对所有mongodb进行鉴权设置,目前活动侧总共有4台,用于某X...

workming
06/29
0
0
MongoDB 3.0+安全权限访问控制

1、启动没有访问控制的MongoDB服务 sudo service mongod start 2、连接到实例 mongo --port 27017 指定额外的命令行选项来连接Mongo shell到部署Mongodb服务器, 如--host 3、创建的用户管理员...

我是小谷粒
06/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java IO类库之ObjectInputStream和ObjectOutPutStream

一、ObjectOutputStream 1 - ObjectOuputStream介绍 ObjectOutputStream(对象字节输出流),用于将一个序列化对象写入到创建ObjectOutputStream时传入的底层字节输入流中,通过源码可知该类继...

老韭菜
11分钟前
0
0
17.TCP:传输控制协议

介绍 TCP和UDP使用同一网络层(IP),但TCP提供了面向连接、可靠的传输层服务 TCP传输给IP层的信息单位称为报文段或段 TCP通过如下方式保证可靠性: 应用数据被分割成TCP认为最合适发送的数据...

loda0128
20分钟前
0
0
重装Oracle时出现environment variable "PATH"错误的解决办法

在win7 64位下重新安装oracle 11g,一直报environment variable "PATH"的错误,按说明将path里多余的路径删除,但没办法解决。选择忽略错误继续安装,装一半会报CRC错误,还是安装失败。最好...

良言
25分钟前
0
0
TensorFlow 全连接的mnist

全连接的mnist import tensorflow as tf# 导入 MINST 数据集from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets("MNIST_data/", one_ho......

阿豪boy
26分钟前
0
0
JAVA 三种WebService 规范

JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。 1. Jaxws(掌握) JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务...

onedotdot
45分钟前
0
0
将博客搬至CSDN

将博客搬至CSDN

xpbob
46分钟前
1
0
Aidl进程间通信详细介绍

目录介绍 1.问题答疑 2.Aidl相关属性介绍 2.1 AIDL所支持的数据类型 2.2 服务端和客户端 2.3 AIDL的基本概念 3.实际开发中案例操作 3.1 aidl通信业务需求 3.2 操作步骤伪代码 3.3 服务端操作...

潇湘剑雨
今天
0
0
python爬虫日志(3)下载图片

import urlliburl='https://xxx.jpg'#图片地址res=urllib.request.urlopen(url)#此函数用于对url的访问data=res.read() #字节流with open(r'D:\1.jpg',"wb") as code: c...

茫羽行
今天
0
0
vue中$emit的用法

1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( event, fn );//监听event事件后运...

JamesView
今天
0
0
bash审计系统搭建

step1:使用saltstack工具bash部署>>>>>> # salt -N clienta state.sls audit step2:安装elasticsearch>>>>>> 注意: 1.不能以root用户进行启动,需要创建用户,并对解压的elasticsearch目录赋......

硅谷课堂
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部