專做蔬菜大棚的網(wǎng)站推廣策劃方案
目錄
- MongoDB 的 集合關(guān)聯(lián)
- 演示前提:
- 登錄單機(jī)模式的 mongodb 服務(wù)器命令
- 登錄【test】數(shù)據(jù)庫(kù)的 mongodb 客戶端命令
- 登錄【admin】數(shù)據(jù)庫(kù)的 mongodb 客戶端命令
- SQL 術(shù)語(yǔ) 與 Mongodb 的對(duì)應(yīng)關(guān)系
- 使用 $lookup 實(shí)現(xiàn)集合關(guān)聯(lián)
- 語(yǔ)法格式
- 添加測(cè)試數(shù)據(jù)
- 1、查詢出訂單數(shù)量大于6,及其對(duì)應(yīng)的商品:
- 1-1:查詢出訂單中,【amount】數(shù)量大于6的訂單
- 1-2:查詢出訂單中,【amount】數(shù)量大于 6 的訂單,及其對(duì)應(yīng)的商品
- 查詢命令
- 命令解釋
- 查詢結(jié)果
- 2、查詢出價(jià)格為 30 的商品所關(guān)聯(lián)的全部訂單
- 2-1:查詢【item】集合中價(jià)格為 30 的商品:
- 2-2:查詢出價(jià)格為 30 的商品所關(guān)聯(lián)的全部訂單
- 查詢命令
- 命令解釋
- 查詢結(jié)果
- 使用 DBRef 實(shí)現(xiàn)集合關(guān)聯(lián)
- 語(yǔ)法格式
- 添加測(cè)試數(shù)據(jù)
- 1、查詢標(biāo)題為 “標(biāo)題2" 的 comment 及對(duì)應(yīng)的商品
- 1-1:查詢標(biāo)題為 “標(biāo)題2" 的 comment
- 查詢命令
- 查詢結(jié)果
- 1-2:查詢標(biāo)題為 “標(biāo)題2" 的 comment 文檔 及 對(duì)應(yīng)的商品
- 查詢返回的文檔只有一條數(shù)據(jù):
- 查詢命令:
- 查詢結(jié)果
- 查詢返回的文檔有多條數(shù)據(jù):
- 查詢命令
- 查詢結(jié)果
MongoDB 的 集合關(guān)聯(lián)
演示前提:
登錄單機(jī)模式的 mongodb 服務(wù)器命令
mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf"
登錄【test】數(shù)據(jù)庫(kù)的 mongodb 客戶端命令
mongo mongodb://192.168.0.107:27017/test -u LJHAAA -p 123456
登錄【admin】數(shù)據(jù)庫(kù)的 mongodb 客戶端命令
mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456
SQL 術(shù)語(yǔ) 與 Mongodb 的對(duì)應(yīng)關(guān)系
使用 $lookup 實(shí)現(xiàn)集合關(guān)聯(lián)
語(yǔ)法格式
在聚集運(yùn)算使用如下文檔:
{$lookup:{from: 指定要連接的集合localField: 指定本集合中文檔的主鍵字段foreignField: 指定要連接的集合中的外鍵字段as: 指定被連接對(duì)象的屬性名}}
localField 和 foreignField 指定兩個(gè)集合之間的關(guān)聯(lián)條件
添加測(cè)試數(shù)據(jù)
原本的 item 集合有這些數(shù)據(jù)
價(jià)格為 30 的【鍵盤(pán)】,和 訂單 1、2、3相關(guān)聯(lián);
價(jià)格為 60 的【鼠標(biāo)】,和 訂單 4、5 相關(guān)聯(lián);
db.order.insert([{item_id: ObjectId("65e6cb5e055c945aa89b8575"), name: "訂單1", amount: 3},{item_id: ObjectId("65e6cb5e055c945aa89b8575"), name: "訂單2", amount: 5},{item_id: ObjectId("65e6cb5e055c945aa89b8575"), name: "訂單3", amount: 8},{item_id: ObjectId("65e6cb5e055c945aa89b8578"), name: "訂單4", amount: 4},{item_id: ObjectId("65e6cb5e055c945aa89b8578"), name: "訂單5", amount: 7}
])
如圖:生成一個(gè)【order】的訂單集合,相當(dāng)于sql的訂單表。
1、查詢出訂單數(shù)量大于6,及其對(duì)應(yīng)的商品:
1-1:查詢出訂單中,【amount】數(shù)量大于6的訂單
1-2:查詢出訂單中,【amount】數(shù)量大于 6 的訂單,及其對(duì)應(yīng)的商品
查詢命令
db.order.aggregate([{$match: {amount: {$gt: 6}}},{ $lookup: {from: "item",localField: "item_id",foreignField: "_id",as: "item_detail"}}
])
命令解釋
db.order.aggregate([ //aggregate 表示對(duì) MongoDB 中的 order 集合執(zhí)行聚集運(yùn)算{$match: {amount: {$gt: 6}}}, //這是聚合管道中的第一個(gè)階段,相當(dāng)于where 條件:查詢 amount > 6 的訂單 { $lookup: // 這是聚合管道中的第二個(gè)階段,使用 $lookup 操作符來(lái)執(zhí)行關(guān)聯(lián)查詢{from: "item", //指定要連接的集合,這里是連接【item】這個(gè)集合(表)localField: "item_id", // 指定當(dāng)前集合(order)中用于關(guān)聯(lián)的字段為 item_idforeignField: "_id", //指定要關(guān)聯(lián)的集合(item)中用于關(guān)聯(lián)的字段為 _idas: "item_detail" //指定將關(guān)聯(lián)查詢的結(jié)果存儲(chǔ)到名為 item_detail 的字段中}}
])
相當(dāng)于 SQL 中的 join 查詢:
select * from order o
join item i on o.item_id = i . _id
where o.amout > 6;
查詢結(jié)果
2、查詢出價(jià)格為 30 的商品所關(guān)聯(lián)的全部訂單
2-1:查詢【item】集合中價(jià)格為 30 的商品:
db.item.aggregate([{$match:{price:30}}
])
2-2:查詢出價(jià)格為 30 的商品所關(guān)聯(lián)的全部訂單
查詢命令
db.item.aggregate([{$match: {price: 30}},{$lookup: {from: "order",localField: "_id",foreignField: "item_id",as: "order_array"}}
])
命令解釋
db.item.aggregate([{$match: {price: 30}}, //這是聚合管道中的第一個(gè)階段,用于篩選出【item】集合中 price 等于 30 的 數(shù)據(jù){$lookup: { //這是聚合管道中的第二個(gè)階段,使用 $lookup 操作符來(lái)執(zhí)行關(guān)聯(lián)查詢from: "order", //指定要關(guān)聯(lián)查詢的集合為 orderlocalField: "_id", //指定當(dāng)前集合(item)中用于關(guān)聯(lián)的字段為 _idforeignField: "item_id", //指定要關(guān)聯(lián)的集合(order)中用于關(guān)聯(lián)的字段為 item_idas: "order_array" //指定將關(guān)聯(lián)查詢的結(jié)果存儲(chǔ)到名為 order_array 的字段中}}
])
查詢結(jié)果
使用 DBRef 實(shí)現(xiàn)集合關(guān)聯(lián)
語(yǔ)法格式
DBRef 盡可能地模擬了SQL數(shù)據(jù)庫(kù)中外鍵——指定要引用哪個(gè)表的哪個(gè)列。
插入文檔時(shí)使用 DBRef 引用其他文檔,DBRef 的完整形式:
{ $ref : 被引用的集合名 , $id : 被引用的文檔主鍵< value > , $db : 被引用的數(shù)據(jù)庫(kù) }
如果被引用的集合在同一個(gè)數(shù)據(jù)庫(kù)中,$db 可以省略。
通過(guò) DBRef 的 fetch() 方法即可抓取關(guān)聯(lián)文檔。
添加測(cè)試數(shù)據(jù)
db.comment.insert([{item: {$ref: "item", $id: ObjectId("65e6cb5e055c945aa89b8575")}, title: "標(biāo)題1", body: "評(píng)論內(nèi)容1"},{item: {$ref: "item", $id: ObjectId("65e6cb5e055c945aa89b8575")}, title: "標(biāo)題2", body: "評(píng)論內(nèi)容2"},{item: {$ref: "item", $id: ObjectId("65e6cb5e055c945aa89b8575")}, title: "標(biāo)題3", body: "評(píng)論內(nèi)容3"},{item: {$ref: "item", $id: ObjectId("65e6cb5e055c945aa89b8575")}, title: "標(biāo)題4", body: "評(píng)論內(nèi)容4"},{item: {$ref: "item", $id: ObjectId("65e6cb5e055c945aa89b8575")}, title: "標(biāo)題5", body: "評(píng)論內(nèi)容5"}
])
item: 這是一個(gè)嵌套的字段,包含了一個(gè)引用到 item 集合中某個(gè)文檔的信息。
$ref: “item”: 指定了引用的集合為 item。
$id: ObjectId(“65e6cb5e055c945aa89b8575”): 指定了引用的文檔的 ObjectId。
如圖:引用了 item 集合中的 id 為 【65e6cb5e055c945aa89b8575】 的文檔
測(cè)試數(shù)據(jù):
1、查詢標(biāo)題為 “標(biāo)題2" 的 comment 及對(duì)應(yīng)的商品
1-1:查詢標(biāo)題為 “標(biāo)題2" 的 comment
查詢命令
db.comment.findOne({title: "標(biāo)題2"})
查詢結(jié)果
1-2:查詢標(biāo)題為 “標(biāo)題2" 的 comment 文檔 及 對(duì)應(yīng)的商品
【備注】如果你已經(jīng)用了 DBRef 來(lái)記錄關(guān)聯(lián),程序可以非常方便處理關(guān)聯(lián),壓根不需要使用 $lookup
查詢返回的文檔只有一條數(shù)據(jù):
查詢命令:
db.comment.findOne({title: "標(biāo)題2"}).item.fetch()
查詢結(jié)果
在 studio 3t 這個(gè)圖形界面工具查詢就出錯(cuò)。
修改成這樣:
db.comment.findOne({title: "標(biāo)題2"}, {item: 1})
在命令行窗口查詢就可以
查詢返回的文檔有多條數(shù)據(jù):
如果查詢的包含了多個(gè)文檔,且要通過(guò)DBRef獲取關(guān)聯(lián)文檔時(shí),
由于 find() 方法返回的是 DBCursor,因此需要先遍歷 DBCursor,然后在通過(guò)查詢文檔的關(guān)聯(lián)屬性來(lái)獲取關(guān)聯(lián)的文檔。
DBCursor 有一個(gè) forEach 方法,該方法需要傳入一個(gè) JS 的 function( c ) {c就代表了正則遍歷的文檔},
通過(guò)該函數(shù)可對(duì)DbCursor中多個(gè)文檔進(jìn)行遍歷。
查詢命令
db.comment.find({title: "標(biāo)題2"}).forEach(function(c){print(JSON.stringify(c) + JSON.stringify(c.item.fetch()));
})