Java MongoDB 多联查询

Java MongoDB 多联查询

前言

我使用的是spring包里的mongoTemplate进行操作Mongo,那基本单表的操作满足日常需求了;但是难免会有要联表操作的时候,mongo-data包里提供了一种Aggregation类,可以理解为建立管道。

联表

LookupOperation这个类就是用来进行联表操作的类,具体方法:

  1. newLookup ,用来创建一个LookupOperation.Builder;
  2. from, 要连接哪张表,类似Mysql的JOIN;
  3. localField,主表哪个字段去连接,指明出来;
  4. foreignField ,连接的那个表哪个字段关联;
  5. as, 从表结果集名,最后会在主表多出这个自定义列,默认List;理解为as一个别名,会把从表的数据以数组的形式在as字段内
		// 联表
        LookupOperation lookupOperation = LookupOperation.newLookup()
                // 连接哪张表
                .from("Item")
                // 主表哪个字段连接
                .localField("sItemId")
                // 从表哪个字段关联
                .foreignField("_id")
                // 从表结果集名 最后会在主表多出这个自定义列 默认List
                .as("item");

Select列

ProjectionOperation这个类可以理解为构造Mysql的Select列

		// 类似mysql的select列 如果要用从表的列 就as自定义列名点属性
        ProjectionOperation  projectionOperation = Aggregation.project("id", "sItemId", "iCount", "item.iDuration", "item.sName", "item.sIcon", "item.sDes", "item.iItemType");

表结构

Item

{
    "_id": "111",
    "sActiveId": "222",
    "sName": "333",
    "sIcon": "444",
    "sDes": "555",
    "iItemType": NumberInt("1"),
    "sValue": "666",
    "iProperty": [
        "0"
    ],
    "iDuration": NumberInt("77"),
    "createTime": ISODate("2022-03-23T08:13:19.694Z"),
    "updateTime": ISODate("2022-03-23T08:13:19.694Z"),
    "iStatus": NumberInt("0")
}

ItemUser

{
    "_id": "222",
    "sActiveId": "333",
    "sItemId": "111",
    "sUserId": "444",
    "iCount": NumberInt("4")
}

生成管道

		// 联表
       LookupOperation lookupOperation = LookupOperation.newLookup()
                // 连接哪张表
                .from("Item")
                // 主表哪个字段连接
                .localField("sItemId")
                // 从表哪个字段关联
                .foreignField("_id")
                // 从表结果集名 最后会在主表多出这个自定义列 默认List
                .as("item");
        // 查询
        Criteria criteria = Criteria.where("sUserId").is("444");
        // 类似mysql的select列 如果要用从表的列 就as自定义列名点属性
        ProjectionOperation  projectionOperation = Aggregation.project("id", "sItemId", "iCount", "item.iDuration", "item.sName", "item.sIcon", "item.sDes", "item.iItemType");
        // 建立管道
        Aggregation aggregation = Aggregation.newAggregation(
                // 联表
                lookupOperation,
                // 查询
                Aggregation.match(criteria),
                // 将某个集合列拆成字段添加主表
                Aggregation.unwind("item"),
                // 排序
                Aggregation.sort(Sort.Direction.DESC, "createTime"),
                // select
                projectionOperation
        );

        AggregationResults<JSONObject> aggregationResults = mongoTemplate.aggregate(aggregation, "ItemUser", JSONObject.class);
        List<JSONObject> result = aggregationResults.getMappedResults();

前面提到,as会在主表新增个列,列里内容是数组,Aggregation.unwind(“item”)的作用就是把as列里数组拆掉,通过ProjectionOperation 加在主表自定义字段中

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaMongoDB集成的方式有很多,其中一种常用的方法是使用MongoDBJava驱动程序来进行游标查询。 游标查询是一种在MongoDB中用于获取大量数据的一种方式。与传统的查询方式不同,游标查询并不是一次性获取全部数据,而是按需获取数据,可以减轻对内存的开销。 在Java中使用游标查询,首先需要导入MongoDBJava驱动程序包。然后,我们可以使用以下代码示例来进行游标查询: ``` // 创建MongoDB链接 MongoClient mongoClient = new MongoClient("localhost", 27017); // 获取数据库 MongoDatabase database = mongoClient.getDatabase("myDatabase"); // 获取集合 MongoCollection<Document> collection = database.getCollection("myCollection"); // 创建查询 Document query = new Document("name", "John"); // 执行查询 FindIterable<Document> cursor = collection.find(query); // 遍历游标结果 for (Document document : cursor) { System.out.println(document); } // 关闭游标和连接 cursor.close(); mongoClient.close(); ``` 在上面的代码中,我们首先创建了一个MongoDB的链接,然后获取了要查询的数据库和集合。接着,我们创建了一个查询文档,并通过`collection.find(query)`方法执行查询,得到一个游标。然后,我们可以使用`for`循环遍历游标的结果,并对每个结果进行相应的处理。最后,我们需要手动关闭游标和关闭MongoDB的链接。 游标查询是一种非常灵活和高效的查询方式,可以处理大量的数据。但是需要注意的是,在使用游标查询时,要避免返回大量的数据,以免对内存造成过大的压力。对于需要返回大量数据的情况,可以考虑使用分页查询的方式来进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值