添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
博学的上铺  ·  mongoTemplate 写入数据 ...·  3 周前    · 
睿智的墨镜  ·  java 使用mongoTemplate ...·  5 月前    · 
重感情的墨镜  ·  Spring Data ...·  5 月前    · 
任性的小熊猫  ·  Spring Data MongoDB ...·  5 月前    · 
打盹的木瓜  ·  ::遠流:: 活用中文大辭典·  1 周前    · 
爱健身的眼镜  ·  RestTemplate·  1 月前    · 
谦和的小蝌蚪  ·  云书网-开启美好生活·  2 月前    · 
// 物料
db.material.insert([
   { "_id" : "M00001", "name" : "油漆", "price" : 12},
   { "_id" : "M00002", "name" : "地板装", "price" : 20 },
   { "_id" : "M00003", "name": "水泥", "price": 50  }
// 材料商
db.merchant.insert([
   { "_id" : "T00001", "name" : "张三建材", "materialCode" : "M00001"},
   { "_id" : "T00002", "name" : "李四建材", "materialCode" : "M00002" },
   { "_id" : "T00003", "name" : "王五建材", "materialCode": "M00003"  }

2.多表关联

2.1关联查询

两个表关联查询

package com.hollysys.tn.controller;
import io.swagger.annotations.Api;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.LookupOperation;
import org.springframework.data.mongodb.core.aggregation.ProjectionOperation;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping(value = "/test")
@Api(tags = "测试")
public class TestController {
	@Autowired
	private MongoTemplate mongo;
	@Data
	@Document("material")
	class Material{
		private String _id;
		private String name;
		private Integer price;
	@Data
	@Document("merchant")
	class Merchant{
		private String _id;
		private String name;
		private String materialCode;
	@Data
	class ResultEntity{
		private String _id;
		private String name;
		private Integer price;
		private String merchantName;
	@GetMapping("/test")
	public List<Map> test() {
		LookupOperation lookupOperation = LookupOperation.newLookup()
				.from("merchant")  // 被关联表
				.localField("_id")	// 主表关联字段
				.foreignField("materialCode")	// 被关联字段
				.as("merchant_as");	// 别名
		ProjectionOperation project = Aggregation.project("_id","name","price")
				.and("merchant_as.name").as("merchantName");
		Aggregation aggregation = Aggregation.newAggregation(lookupOperation,project);
		List<Map> result =  mongo.aggregate(aggregation,"material",Map.class).getMappedResults();
		//List<ResultEntity> result =  mongo.aggregate(aggregation,"material",ResultEntity.class).getMappedResults();
		System.out.println(result);
		return result;

执行的结果如下:

"_id": "M00001", "name": "油漆", "price": 12.0, "merchantName": [ "张三建材" "_id": "M00002", "name": "地板装", "price": 20.0, "merchantName": [ "李四建材" "_id": "M00003", "name": "水泥", "price": 50.0, "merchantName": [ "王五建材"

应该注意到了,返回结果中的merchantName是一个数组,如果需要像对象一样,如下:

"_id": "M00001", "name": "油漆", "price": 12, "merchantName": "张三建材" "_id": "M00002", "name": "地板装", "price": 20, "merchantName": "李四建材" "_id": "M00003", "name": "水泥", "price": 50, "merchantName": "王五建材"

有两种方法可以实现上面的效果

  • 1.可以单独设置一个返回对象,具体见代码注释部分中的ResultEntity对象
  • 2.修改代码,加Aggregation.unwind("merchantName"),用来打散数组
Aggregation aggregation = Aggregation.newAggregation(lookupOperation,project,Aggregation.unwind("merchantName"));

下面是具体的mongo查询语句:

db.material.aggregate([
        $lookup:{
            from: "merchant",
            localField: "_id",
            foreignField: "materialCode",
            as: "merchant_as"
        $project:{
            "_id":1,
            "name":1,
            "price":1,
            "merchantName":"$merchant_as.name"
        $unwind:"$merchantName"

2.2 关联 + 查询条件

其实如果理解了mong的语法,下面的理解起来就更简单了。

  • 1.如先筛选主表,查询价格小于30的物料
Criteria criteria = new Criteria().and("price").lt(30);
Aggregation aggregation = Aggregation.newAggregation(
				Aggregation.match(criteria),
				lookupOperation,
				project,
				Aggregation.unwind("merchantName"));

结果如下:

"_id": "M00001", "name": "油漆", "price": 12.0, "merchantName": "张三建材" "_id": "M00002", "name": "地板装", "price": 20.0, "merchantName": "李四建材"
  • 2.对结果再次筛选,筛选出材料商是【张三建材】
Criteria criteria2 = new Criteria().and("merchantName").is("张三建材");
		Aggregation aggregation = Aggregation.newAggregation(
				Aggregation.match(criteria),
				lookupOperation,
				project,
				Aggregation.unwind("merchantName"),
				Aggregation.match(criteria2));

结果如下:

"_id": "M00001", "name": "油漆", "price": 12.0, "merchantName": "张三建材"

下面是具体的mongo查询语句:

db.material.aggregate([
        $match:{"price" : { "$lt" : 30 } }
        $lookup:{
            from: "merchant",
            localField: "_id",
            foreignField: "materialCode",
            as: "merchant_as"
        $project:{
            "_id":1,
            "name":1,
            "price":1,
            "merchantName":"$merchant_as.name"
        $unwind:"$merchantName"
        $match : { "merchantName" : "张三建材" }

2.3 小结

使用MongoTemplate之前最好熟悉下mongo的基本语法。个人用mongo时间也不长,还没到熟练的阶段,有什么问题希望提出来,大家一起学习进步!

这篇就到这里,后面有空再补充其他的。

关于Mongodb + java + 多表关联查询(MongoTemplate)自己关于使用MongoTemplate的一点总结1.创建集合// 物料db.material.insert([ { "_id" : "M00001", "name" : "油漆", "price" : 12}, { "_id" : "M00002", "name" : "地板装", "price" : 20 }, { "_id" : "M00003", "name": "水泥", "price":
本文实例讲述了MongoDB多表关联查询操作。分享给大家供大家参考,具体如下: Mongoose的多表关联查询 首先,我们回忆一下,MySQL多表关联查询的语句: student表: calss表: 通过student的classId关联进行查询学生名称,班级的数据: SELECT student.name,student.age,class.name FROM student,class WHERE student.classId = class.id Mongoose多表联合查询(还是以众所周知的学生、班级作为实例) · 表结构的定义(schemas目录下) 1. student表(s
在做自己的项目时,因为刚开始接触mongodb非关系型数据库以及关系型数据库的影响还是留在脑中,总会想着进行一个连表查询,然后看官网和资料学习了下,还有那个查询时使用正则来匹配,在这里做个记录 1.mongodb正则匹配 /* 使用$regex字段匹配 */ name: {$regex: 'aa', $options: 'i'}; name: {$regex: /aa/, $options: 'i'}; name: {$regex: /aa/i}; /* 直接使用表达式 */ name: {/aa/i} /* 使用$in来匹配,这个字段必须是一个数组 */
mongoDB】 学习(三)java + mongodb 多表联合查询 mongoDBJava、$lookup、 $project、 $match 等 1、先介绍这次使用的 mongoDB 内的方法以及使用方式(Robo 3T 1.3.1) mongoDB 官网 https://docs.mongodb.com/manual/reference/operator/aggregation/project/index.html (1)$lookup 类似SQL server里面的 join @Document("Schedule") @Accessors(chain = true) public class Schedule extends BaseMongoEntity { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "医院编号") @Indexed //.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 二、自定义配置MongoTemplate @Configuration public class MongodbConfig { @Value("${s
Java 中使用 MongoDB 进行多表关联查询可以通过使用 MongoDB 的聚合管道(Aggregation Pipeline)来实现。聚合管道是一系列操作步骤,可以将多个表的数据进行关联和处理。 下面是一个示例代码,展示了如何在 Java 中使用 MongoDB 的聚合管道进行多表关联查询: ```java import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.model.Aggregates; import com.mongodb.client.model.Filters; import com.mongodb.client.model.LookupOperation; import org.bson.Document; public class Main { public static void main(String[] args) { // 连接 MongoDB try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) { MongoCollection<Document> ordersCollection = mongoClient.getDatabase("mydb").getCollection("orders"); MongoCollection<Document> customersCollection = mongoClient.getDatabase("mydb").getCollection("customers"); // 定义聚合管道操作 LookupOperation lookupOperation = LookupOperation .from("customers", "customerId", "_id", "customerInfo"); // 构建聚合管道 AggregateIterable<Document> result = ordersCollection.aggregate(Arrays.asList( Aggregates.match(Filters.eq("status", "completed")), lookupOperation // 遍历查询结果 for (Document document : result) { System.out.println(document); 上述示例代码中,我们假设有两个集合:`orders` 和 `customers`。`orders` 集合中的每个文档包含一个 `customerId` 字段,该字段与 `customers` 集合中的 `_id` 字段关联。我们使用 `LookupOperation` 来进行关联查询,并使用 `match` 操作来过滤出状态为 "completed" 的订单。 请注意,这只是一个简单的示例,实际的多表关联查询可能需要更复杂的聚合管道操作来满足特定的需求。你可以根据自己的实际情况进行相应的调整和扩展。 希望能帮助到你!如果有更多问题,请随时提问。