時(shí)間:2024-03-26 14:36作者:下載吧人氣:27
MongoDB是當(dāng)今最為流行的NoSQL數(shù)據(jù)庫,它提供了一種聯(lián)表查詢(Join)的機(jī)制,可以滿足復(fù)雜的查詢需求。通過聯(lián)表查詢,可以把不同文檔的數(shù)據(jù)關(guān)聯(lián)起來,也就是實(shí)現(xiàn)了關(guān)系型數(shù)據(jù)庫中Join類型操作的功能。
MongoDB的聯(lián)表查詢用法可以分成三種:lookup(用于前后指定字段名)、$lookup(支持管道操作符)和聚合框架-(Aggretaion Framework)。
首先,讓我們來看一下lookup的用法,lookup特別適合于“一對(duì)一”和“一對(duì)多”的關(guān)系。假設(shè)我們有兩個(gè)集合,一個(gè)是訂單集合,一個(gè)是客戶集合。訂單集合中有存放客戶ID,而客戶集合中有客戶姓名等信息。我們想要查詢出每筆訂單的客戶姓名,就可以使用lookup實(shí)現(xiàn)聯(lián)表查詢。具體的查詢語句如下:
db.orders.aggregate([
{
$lookup: {
from: ‘customers’,
localField: ‘cust_id’,
foreignField: ‘_id’,
as: ‘customer_info’
}
}
])
其次,很多人在查詢的時(shí)候都會(huì)用到$lookup進(jìn)行聯(lián)表查詢,這也是最常用的,因?yàn)樗氖褂闷饋砀屿`活一些,可以支持管道操作符,讓我們來看看$lookup的例子:
db.orders.aggregate([
{
‘$lookup’: {
from: ‘customers’,
‘let’: {‘cust_id’: ‘$cust_id’},
pipeline: [
{
‘$match’: {
‘$expr’: {
‘$eq’: [
‘$$cust_id’, ‘$_id’
]
}
}
}
],
as: ‘customer_info’
}
}
])
最后,我們還可以使用聚合框架實(shí)現(xiàn)聯(lián)表查詢操作,聚合框架允許我們?cè)诓樵冎惺褂幂^復(fù)雜的功能,可以把查詢條件設(shè)置在管道內(nèi)部(內(nèi)嵌文檔),可以分配結(jié)果集,也可以實(shí)現(xiàn)Lookup類型的聯(lián)表查詢。
db.job.aggregate([
{
$lookup: {
from: ‘user’,
let: { id: ‘$user_id’},
pipeline: [
{$match: {$expr: {$eq: [‘$_id’, ‘$$id’]}}},
{$project: {name: 1, _id: 0}}
],
as: ‘user_info’
}
},
{$project: {user_info: 1. _id: 0}}
])
以上就是MongoDB聯(lián)表查詢的三種用法,也就是lookup、$lookup還有聚合框架。當(dāng)我們遇到需要復(fù)雜的查詢需求的時(shí)候,這些技術(shù)都可以派上用場,靈活的使用不同的技術(shù),一定能幫助我們快速解決和處理問題。
網(wǎng)友評(píng)論