Mongo多个Collection的关联操作实现

简介: 题记在mysql,oracle等关系型数据库中,可以通过表之间的关联操作(join, left join, and)实现字段之间的关联操作。而在mongo非关系型数据库中没有对应的接口。为此,我们自身实现了1个Mongo db库中的多个collection之间的类笛卡尔操作。(这种需求,多少有些不合理)

1、需求:Mongo多个Collection之间的关联操作

输入: gatherList,

组成如下:


List <Object> la = Arrays.asList (new Object [] {'A', 'B', 'C', 'D'}); //1

List <Object> lb = Arrays.asList (new Object [] {1, 2, 3, 4}); //2

List <Object> lc = Arrays.asList (new Object [] {"百度", "小米", "谷歌", "Facebook"}); //3

List <Object> ld = Arrays.asList (new Object [] {"雷军", "乔布斯", "罗永浩", "罗胖子"}); ///4

List <Object> le = Arrays.asList (new Object [] {"微博", "微信", "陌陌", "脉脉"}); //5


List <List <Object>> gatherList = new ArrayList <List <Object>> ();

gatherList.add(la);

gatherList.add(lb);

gatherList.add(lc);

gatherList.add(ld);

gatherList.add(le);

1

2

3

4

5

6

7

8

9

10

11

12

输出: CartesianIterable dkRst


CartesianIterable dkRst = CartesianIteratorTest.dk_process_obj(gatherList);


原理:合集处理——笛卡尔迭代器实现,逐个遍历元素,形成一个笛卡尔集合。

参考:http://stackoverflow.com/questions/714108/cartesian-product-of-arbitrary-sets-in-java


2、关联结果入Mongodb。

void mongoInsertObj(CartesianIterable dkRst,

List labelNameList, int iGatherListSize)

输入:1) CartesianIterable dkRst, 笛卡尔结果。

2) List labelNameList,列名称集。

3) int iGatherListSize, 笛卡尔结果的组数,即 gatherList集的大小,等同于 列名称集的大小。

输出:空。

算法实现:集合拆分——以 gatherList集的大小为一组,对应一个document入库。

源码:


public static void mongoInsertObj(CartesianIterable<Object> dkRst,

List<String> labelNameList, int iGatherListSize)

throws UnknownHostException {

try {

/**** Connect to MongoDB ****/

// Since 2.10.0, uses MongoClient

MongoClient mongo = new MongoClient("110.20.12.41", 27017);


/**** Get database ****/

// if database doesn't exists, MongoDB will create it for you

DB db = mongo.getDB("data");


/**** Get collection / table from 'testdb' ****/

DBCollection table = db.getCollection(testCollName);

for (List <Object> lo: dkRst){

int iObjSize = lo.size();

BasicDBObject document = new BasicDBObject();

for (int i = 0; i < iObjSize; i+=iGatherListSize) {

//System.out.println("NtnbRisk.labelNameList[0] = " + NtnbRisk.labelNameList[0]);

for (int j = 0; j < iGatherListSize; j++) {

// create a document to store key and value

document.put(labelNameList.get(j), lo.get(i+j)); //1

}

table.insert(document);

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

http://stackoverflow.com/questions/714108/cartesian-product-of-arbitrary-sets-in-java


3、结果如下

数据集合的大小为:4*4*4*4*4=1024;

image.png

image.png

相关文章
|
6月前
|
Go API 数据库
milvus的db和collection信息查询
milvus的db和collection信息查询
1120 0
|
6月前
|
开发工具 Python
milvus的delete操作
milvus的delete操作
1274 0
|
29天前
|
NoSQL MongoDB 数据库
MongoDB 更新集合名
10月更文挑战第13天
33 5
MongoDB-聚合操作$group
group 括号当中属性的含义: _id: 定义分组规则 <field>: 定义新字段
91 0
|
JavaScript NoSQL 关系型数据库
mongo 详解修改操作
在mongo中的数组操作是不同的,会有专门的指令来进行修改.
mongo 详解修改操作
|
NoSQL Java MongoDB
Java操作MongoDB(聚合函数)向Mongo插入及查询数据(上)
Java操作MongoDB(聚合函数)向Mongo插入及查询数据
504 0
Java操作MongoDB(聚合函数)向Mongo插入及查询数据(上)
|
存储 NoSQL 关系型数据库
MongoDB(4)- Collection 集合相关
MongoDB(4)- Collection 集合相关
161 0
MongoDB(4)- Collection 集合相关
|
NoSQL Java MongoDB
Java操作MongoDB(聚合函数)向Mongo插入及查询数据( 下)
Java操作MongoDB(聚合函数)向Mongo插入及查询数据
638 0
|
关系型数据库
Mongo多个Collection的关联操作实现
在mysql,oracle等关系型数据库中,可以通过表之间的关联操作(join, left join, and)实现字段之间的关联操作。而在mongo非关系型数据库中没有对应的接口。为此,我们自身实现了1个Mongo db库中的多个collection之间的类笛卡尔操作。
590 0