天天看點

Mongodb學習整理之關聯查詢

在關系型資料庫中,我們設計表的時候是根據範式來設計,根據ER模型設計資料庫原型等,但是Mongodb是一個無模式文檔型資料庫,他不能像關系型資料庫一樣進行文法及的關聯,但是無模式也有他的好處,Mongodb可以根據對應關系将文檔内聯,内聯的方式對于一對一或者一對多的關系是非常有效的,但是到了多對多表現的其實就是非常不完美了,如果一個勁的内聯其實也可以解決問題,但是如果一個文檔的資料量太多,超過了18M也是問題,是以文檔關聯的非常重要的,是以Mongodb也知道了這個問題,他們提供了一個$lookup,這個操作時放在聚合函數中的,是以說這個操作的重要性還是很明顯的,為什麼這麼說呢?因為目前的Mongodb的主要操作分為兩大類,第一大類是基于單個集合的增删改查,另一大類就是聚合,對于單一集合的操作對我們來說基本不存在什麼問題,隻要是對業務個固定場景設計好即可,但是針對聚合操作我們可以做的就很多了,這裡的聚合有點像關系型資料庫的groupby但是還有很多其他的功能,比如我們今天要說的關聯查詢,$loopkup有4個參數,分别是:from,localField,foreignField和as,具體每個字段的含義我先不說,先上一段代碼,這段代碼是基于spring-data-mongodb的實作。

@RequestMapping("getlookupOp")
	@ResponseBody
	public Map<String, Object> getlookupOp() {
		Map<String, Object> msg = Maps.newHashMap();
		LookupOperation op = LookupOperation.newLookup().from("user_info").localField("departId").foreignField("no")
				.as("userList");
		ProjectionOperation project = Aggregation.project("departId")
				.and("departName").as("departName")
				.and("userList.username").as("userId")
				.and("userList.no").as("deptNo")
				.and("userList.indate").as("inDate")
				.and("userList.age").as("userAge")
				.and("userList.address").as("userAddress");
		
		Aggregation aggregation = Aggregation.newAggregation(op,project);
		
		AggregationResults<Document> results = mongoTemplate.aggregate(aggregation, "department_info", Document.class);
		msg.put("msg", results.getMappedResults());
		return msg;
	}
           

這個裡面我設計了兩個文檔,分别是:

{
    "_id" : ObjectId("5beccb64b3fadf1904674e99"),
    "departId" : "11",
    "departName" : "datacenter"
}
           
{
    "_id" : ObjectId("5b908750dac78d1a5cb62dd7"),
    "username" : "whthomas",
    "no" : "11",
    "indate" : ISODate("2018-11-14T12:12:12.000Z"),
    "age" : "21",
    "address" : {
        "city" : "shenyang",
        "zone" : "heping"
    }
}
           

我們想要操作的目的是對結果進行關聯,關聯字段是departId和no,讓後将關聯後取到的user_info表資料内聯到表中。對應的關系型資料庫的操作是:

select department_info.*,user_info.* as userList from department_info left join user_info on department_info.departId=user_info.no
           

是不是一下就明白了,Mongodb可以做的事情還是很多的,還有很多是我們可以挖掘的,努力吧。