国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
NoSQL == No JOIN?
MongoDB聚合
將所有內(nèi)容放在一起
太棒了!我終于可以切換到NoSQL了!
關(guān)于在MongoDB NoSQL數(shù)據(jù)庫中使用JOIN的常見問題解答 (FAQ)
SQL連接和MongoDB連接有什么區(qū)別?
MongoDB中的$lookup階段是如何工作的?
我可以使用MongoDB連接執(zhí)行遞歸搜索嗎?
如何在使用MongoDB連接時優(yōu)化性能?
我可以在MongoDB中連接多個集合嗎?
在使用MongoDB連接時,如何處理空值或缺失值?
我可以將MongoDB連接與分片集合一起使用嗎?
如何對MongoDB中的已連接文檔進(jìn)行排序?
我可以將MongoDB連接與find()方法一起使用嗎?
如何調(diào)試或排除MongoDB連接故障?
首頁 科技周邊 IT業(yè)界 在MongoDB NOSQL數(shù)據(jù)庫中使用加入

在MongoDB NOSQL數(shù)據(jù)庫中使用加入

Feb 18, 2025 pm 12:59 PM

Using JOINs in MongoDB NoSQL Databases

核心要點(diǎn)

  • MongoDB,一個NoSQL數(shù)據(jù)庫,在3.2版本中引入了新的$lookup操作符,可以在兩個或多個集合上執(zhí)行類似LEFT-OUTER-JOIN的操作,從而實(shí)現(xiàn)類似關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)管理。然而,此操作符僅限于聚合操作中使用,聚合操作比簡單的查找查詢更復(fù)雜,通常也更慢。
  • MongoDB的$lookup操作符需要四個參數(shù):localField(輸入文檔中的查找字段)、from(要連接的集合)、foreignField(在from集合中查找的字段)和as(輸出字段的名稱)。此操作符可用于聚合查詢中,以匹配帖子、按順序排序、限制項(xiàng)目數(shù)量、連接用戶數(shù)據(jù)、展平用戶數(shù)組并僅返回必要的字段。
  • 雖然MongoDB的$lookup操作符很有用,可以幫助在NoSQL數(shù)據(jù)庫中管理少量關(guān)系數(shù)據(jù),但它不能替代SQL中更強(qiáng)大的JOIN子句。如果在MongoDB中刪除用戶文檔,孤兒帖子文檔將保留,表明缺乏約束。因此,如果頻繁使用$lookup操作符,可能表明使用了錯誤的數(shù)據(jù)存儲,關(guān)系型(SQL)數(shù)據(jù)庫可能更適合。

Using JOINs in MongoDB NoSQL Databases 感謝Julian Motz的同行評審幫助。


SQL和NoSQL數(shù)據(jù)庫之間最大的區(qū)別之一是JOIN。在關(guān)系型數(shù)據(jù)庫中,SQL JOIN子句允許您使用它們之間的一個公共字段來組合來自兩個或多個表的行。例如,如果您有書籍和出版商的表,您可以編寫如下SQL命令:

SELECT book.title, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;

換句話說,book表有一個publisher_id字段,它引用publisher表中的id字段。

這是實(shí)用的,因?yàn)閱蝹€出版商可以提供數(shù)千本書籍。如果我們將來需要更新出版商的詳細(xì)信息,我們可以更改單個記錄。數(shù)據(jù)冗余被最小化,因?yàn)槲覀儾恍枰獮槊恳槐緯貜?fù)出版商的信息。此技術(shù)稱為規(guī)范化。

SQL數(shù)據(jù)庫提供一系列規(guī)范化和約束功能,以確保維護(hù)關(guān)系。

NoSQL == No JOIN?

并非總是如此…

面向文檔的數(shù)據(jù)庫(如MongoDB)旨在存儲非規(guī)范化數(shù)據(jù)。理想情況下,集合之間不應(yīng)該有任何關(guān)系。如果相同的數(shù)據(jù)需要在兩個或多個文檔中,則必須重復(fù)。

這可能會令人沮喪,因?yàn)閹缀鯖]有你永遠(yuǎn)不需要關(guān)系數(shù)據(jù)的情況。幸運(yùn)的是,MongoDB 3.2引入了一個新的$lookup操作符,它可以在兩個或多個集合上執(zhí)行類似LEFT-OUTER-JOIN的操作。但是有一個問題…

MongoDB聚合

$lookup僅允許在聚合操作中使用??梢詫⑵湟暈橐幌盗胁僮鞣墓艿溃@些操作符查詢、過濾和分組結(jié)果。一個操作符的輸出用作下一個操作符的輸入。

聚合比簡單的查找查詢更難理解,并且通常運(yùn)行速度較慢。但是,它們功能強(qiáng)大,對于復(fù)雜的搜索操作來說是一個寶貴的選項(xiàng)。

最好用一個例子來解釋聚合。假設(shè)我們正在創(chuàng)建一個具有用戶集合的社交媒體平臺。它將每個用戶的詳細(xì)信息存儲在單獨(dú)的文檔中。例如:

SELECT book.title, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;

我們可以根據(jù)需要添加任意數(shù)量的字段,但是所有MongoDB文檔都需要一個具有唯一值的_id字段。_id類似于SQL主鍵,如果需要,將自動插入。

我們的社交網(wǎng)絡(luò)現(xiàn)在需要一個帖子集合,該集合存儲用戶的大量有見地的更新。文檔存儲文本、日期、評級和在user_id字段中引用撰寫它的用戶:

{
  "_id": ObjectID("45b83bda421238c76f5c1969"),
  "name": "User One",
  "email": "userone@email.com",
  "country": "UK",
  "dob": ISODate("1999-09-13T00:00:00.000Z")
}

我們現(xiàn)在想顯示所有用戶按時間逆序排列的最后二十個評級為“important”的帖子。每個返回的文檔都應(yīng)包含文本、帖子的時間以及關(guān)聯(lián)用戶的姓名和國家/地區(qū)。

MongoDB聚合查詢傳遞一個管道操作符數(shù)組,這些操作符按順序定義每個操作。首先,我們需要使用$match過濾器從帖子集合中提取所有具有正確評級的文檔:

{
  "_id": ObjectID("17c9812acff9ac0bba018cc1"),
  "user_id": ObjectID("45b83bda421238c76f5c1969"),
  "date": ISODate("2016-09-05T03:05:00.123Z"),
  "text": "My life story so far",
  "rating": "important"
}

我們現(xiàn)在必須使用$sort操作符按時間逆序?qū)ζヅ涞捻?xiàng)目進(jìn)行排序:

{ "$match": { "rating": "important" } }

由于我們只需要二十個帖子,因此我們可以應(yīng)用$limit階段,以便MongoDB只需要處理我們想要的數(shù)據(jù):

{ "$sort": { "date": -1 } }

我們現(xiàn)在可以使用新的$lookup操作符連接來自用戶集合的數(shù)據(jù)。它需要一個具有四個參數(shù)的對象:

  • localField:輸入文檔中的查找字段
  • from:要連接的集合
  • foreignField:在from集合中查找的字段
  • as:輸出字段的名稱。

因此,我們的操作符是:

{ "$limit": 20 }

這將在我們的輸出中創(chuàng)建一個名為userinfo的新字段。它包含一個數(shù)組,其中每個值都與用戶文檔匹配:

{ "$lookup": {
  "localField": "user_id",
  "from": "user",
  "foreignField": "_id",
  "as": "userinfo"
} }

我們之間存在一對一的關(guān)系post.user_iduser._id,因?yàn)橐粋€帖子只能有一個作者。因此,我們的userinfo數(shù)組將永遠(yuǎn)只包含一個項(xiàng)目。我們可以使用$unwind操作符將其分解成一個子文檔:

"userinfo": [
  { "name": "User One", ... }
]

輸出現(xiàn)在將轉(zhuǎn)換為更實(shí)用的格式,可以應(yīng)用其他操作符:

{ "$unwind": "$userinfo" }

最后,我們可以使用管道中的$project階段返回文本、帖子的時間、用戶的姓名和國家/地區(qū):

SELECT book.title, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;

將所有內(nèi)容放在一起

我們的最終聚合查詢匹配帖子、按順序排序、限制為最新的二十個項(xiàng)目、連接用戶數(shù)據(jù)、展平用戶數(shù)組并僅返回必要的字段。完整命令:

{
  "_id": ObjectID("45b83bda421238c76f5c1969"),
  "name": "User One",
  "email": "userone@email.com",
  "country": "UK",
  "dob": ISODate("1999-09-13T00:00:00.000Z")
}

結(jié)果是一個最多包含二十個文檔的集合。例如:

{
  "_id": ObjectID("17c9812acff9ac0bba018cc1"),
  "user_id": ObjectID("45b83bda421238c76f5c1969"),
  "date": ISODate("2016-09-05T03:05:00.123Z"),
  "text": "My life story so far",
  "rating": "important"
}

太棒了!我終于可以切換到NoSQL了!

MongoDB $lookup很有用且功能強(qiáng)大,但即使這個基本示例也需要一個復(fù)雜的聚合查詢。它不能替代SQL中更強(qiáng)大的JOIN子句。MongoDB也不提供約束;如果刪除用戶文檔,孤兒帖子文檔將保留。

理想情況下,$lookup操作符應(yīng)該很少需要。如果您經(jīng)常需要它,您可能使用了錯誤的數(shù)據(jù)存儲……

如果您有關(guān)系數(shù)據(jù),請使用關(guān)系型(SQL)數(shù)據(jù)庫!

也就是說,$lookup是MongoDB 3.2的一個受歡迎的補(bǔ)充。它可以克服在NoSQL數(shù)據(jù)庫中使用少量關(guān)系數(shù)據(jù)時的一些更令人沮喪的問題。

關(guān)于在MongoDB NoSQL數(shù)據(jù)庫中使用JOIN的常見問題解答 (FAQ)

SQL連接和MongoDB連接有什么區(qū)別?

在SQL數(shù)據(jù)庫中,連接操作根據(jù)它們之間相關(guān)的列組合來自兩個或多個表的行。但是,MongoDB作為NoSQL數(shù)據(jù)庫,不支持傳統(tǒng)的SQL連接。相反,MongoDB提供兩種執(zhí)行類似操作的方法:聚合中的$lookup階段和$graphLookup階段。這些方法允許您將來自多個集合的數(shù)據(jù)組合到單個結(jié)果集中。

MongoDB中的$lookup階段是如何工作的?

MongoDB中的$lookup階段允許您連接來自另一個集合(“已連接”集合)的文檔,并將已連接的文檔添加到輸入文檔中。$lookup階段指定“from”集合、“l(fā)ocalField”和“foreignField”用于匹配文檔,以及“as”字段用于輸出文檔。它類似于SQL中的左外連接,返回來自輸入集合的所有文檔以及來自“from”集合的匹配文檔。

我可以使用MongoDB連接執(zhí)行遞歸搜索嗎?

是的,MongoDB為遞歸搜索提供了$graphLookup階段。$graphLookup階段對指定的集合執(zhí)行遞歸搜索,并可以選擇限制搜索的深度和廣度。它對于查詢分層數(shù)據(jù)或圖很有用,其中級別數(shù)未知或可能變化。

如何在使用MongoDB連接時優(yōu)化性能?

為了在使用MongoDB連接時優(yōu)化性能,請考慮以下策略:對“l(fā)ocalField”和“foreignField”使用索引以加快匹配過程;限制“from”集合中的文檔數(shù)量;以及在$lookup階段之前使用$match$project階段來過濾和轉(zhuǎn)換文檔。

我可以在MongoDB中連接多個集合嗎?

是的,您可以通過在聚合管道中鏈接多個$lookup階段來連接多個MongoDB集合。每個$lookup階段都會將來自另一個集合的已連接文檔添加到輸入文檔中。

在使用MongoDB連接時,如何處理空值或缺失值?

在使用MongoDB連接時,如果輸入集合中的文檔與“from”集合中的任何文檔都不匹配,則$lookup階段會向“as”字段添加一個空數(shù)組。您可以通過在$lookup階段之后添加$match階段來處理這些空值或缺失值,以過濾掉具有空“as”字段的文檔。

我可以將MongoDB連接與分片集合一起使用嗎?

從MongoDB 3.6開始,$lookup$graphLookup階段可以接受分片集合作為“from”集合。但是,由于額外的網(wǎng)絡(luò)開銷,性能可能不如非分片集合。

如何對MongoDB中的已連接文檔進(jìn)行排序?

您可以通過在聚合管道中的$lookup階段之后添加$sort階段來對MongoDB中的已連接文檔進(jìn)行排序。$sort階段按升序或降序?qū)χ付ㄗ侄沃械奈臋n進(jìn)行排序。

我可以將MongoDB連接與find()方法一起使用嗎?

不可以,MongoDB連接不能與find()方法一起使用。$lookup$graphLookup階段是聚合框架的一部分,它提供比find()方法更高級的數(shù)據(jù)處理功能。

如何調(diào)試或排除MongoDB連接故障?

要調(diào)試或排除MongoDB連接故障,您可以使用explain()方法來分析聚合管道的執(zhí)行計(jì)劃。explain()方法提供有關(guān)階段的詳細(xì)信息,包括處理的文檔數(shù)量、花費(fèi)的時間以及索引的使用情況。

以上是在MongoDB NOSQL數(shù)據(jù)庫中使用加入的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

開發(fā)人員的快捷方式到您的Udemy樣平臺 開發(fā)人員的快捷方式到您的Udemy樣平臺 Jun 17, 2025 pm 04:43 PM

在開發(fā)類似于Udemy的學(xué)習(xí)平臺時,重點(diǎn)不僅僅是內(nèi)容質(zhì)量。同樣重要的是如何交付內(nèi)容。這是因?yàn)楝F(xiàn)代教育平臺依賴于媒體,快速且易于消化。

用于購買SSL證書的經(jīng)濟(jì)有效的轉(zhuǎn)售商平臺 用于購買SSL證書的經(jīng)濟(jì)有效的轉(zhuǎn)售商平臺 Jun 25, 2025 am 08:28 AM

在一個在線信任不可談判的世界中,SSL證書對于每個網(wǎng)站都至關(guān)重要。 SSL認(rèn)證的市場規(guī)模在2024年價值56億美元,并且由于電子商務(wù)業(yè)務(wù)的激增而推動了強(qiáng)勁的增長

SaaS的5個最佳支付門戶:您的最終指南 SaaS的5個最佳支付門戶:您的最終指南 Jun 29, 2025 am 08:28 AM

付款網(wǎng)關(guān)是付款過程的關(guān)鍵組成部分,使企業(yè)能夠在線接受付款。它充當(dāng)客戶與商人之間的橋梁,安全地傳輸付款信息并促進(jìn)交易。 為了

由于新的Microsoft AI型號 由于新的Microsoft AI型號 Jul 05, 2025 am 12:44 AM

一種新的人工智能(AI)模型已經(jīng)證明了比幾個使用最廣泛使用的全球預(yù)測系統(tǒng)更快,更精確地預(yù)測重大天氣事件的能力。該名為Aurora的模型已接受過培訓(xùn)。

新研究聲稱AI比我們更好地'理解”情緒。特別是在情感上充滿電的情況下 新研究聲稱AI比我們更好地'理解”情緒。特別是在情感上充滿電的情況下 Jul 03, 2025 pm 05:48 PM

在我們認(rèn)為人類始終超越機(jī)器的領(lǐng)域的另一個挫折中,研究人員現(xiàn)在建議AI比我們更好地理解情感。研究人員發(fā)現(xiàn)人工智能證明了一個

您的設(shè)備喂養(yǎng)AI助手并收集個人數(shù)據(jù),即使他們睡著了。這是如何知道您分享的內(nèi)容。 您的設(shè)備喂養(yǎng)AI助手并收集個人數(shù)據(jù),即使他們睡著了。這是如何知道您分享的內(nèi)容。 Jul 05, 2025 am 01:12 AM

不管喜歡與否,人工智能已成為日常生活的一部分。許多設(shè)備(包括電動剃須刀和牙刷)已成為AI驅(qū)動的“使用機(jī)器學(xué)習(xí)算法來跟蹤一個人的使用方式,Devi的方式

高級AI型號的CO₂回答相同問題時的排放量比更常見的LLM 高級AI型號的CO₂回答相同問題時的排放量比更常見的LLM Jul 06, 2025 am 12:37 AM

根據(jù)最近的一項(xiàng)研究,我們試圖使AI模型的功能越精確,其碳排放量就越大 - 某些提示產(chǎn)生的二氧化碳比其他提示高達(dá)50倍。

See all articles