日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MongoDB进阶-内嵌文档查询

發(fā)布時間:2025/3/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MongoDB进阶-内嵌文档查询 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作為非關(guān)系型數(shù)據(jù)庫中的佼佼者,MongoDB一大優(yōu)勢在于能夠在一條文檔中存儲對象類型的數(shù)據(jù),適當(dāng)增加冗余來讓數(shù)據(jù)庫更好用。文檔中一個對象類型的字段在MongoDB中被稱為內(nèi)嵌文檔(Embedded),也是MongoDB推薦的存儲形式。本文將基于官方文檔介紹內(nèi)嵌文檔的查詢方法。

1.內(nèi)嵌文檔的適用場景

對于初創(chuàng)企業(yè)的技術(shù)團(tuán)隊來說,快速變動的需求導(dǎo)致沒有必要花費過多精力設(shè)計關(guān)系嚴(yán)格的數(shù)據(jù)表,而是可以直接將相關(guān)聯(lián)的數(shù)據(jù)字段放在一起,比如以下設(shè)計:

db.books.insertMany( [{ _id: 1, name: "python", price: 25, size: { h: 14, w: 21}, reading: ["Tom","John"] },{ _id: 2, name: "mongo", price: 50, size: { h: 8.5, w: 11}, reading: ["John","Dave"] },{ _id: 3, name: "webGL", price: 80, size: { h: 8.5, w: 11}, reading: ["Lily"] }, ]); 復(fù)制代碼

如果使用類似關(guān)系型數(shù)據(jù)主鍵的將_id作為引用的方式如下:

db.books.insertMany( [{ _id: 1, name: "python", price: 25, h: 14, w: 21, reading: ["Tom","John"] },{ _id: 2, name: "mongo", price: 50, h: 8.5, w: 11, reading: ["John","Dave"] },{ _id: 3, name: "webGL", price: 80, h: 8.5, w: 11, reading: ["Lily"] }, ]);db.reading.insertMany( [{ _id: 4, reader: "Tom", book_id:1 },{ _id: 5, reader: "John", book_id:1 },{ _id: 6, reader: "John", book_id:2 },{ _id: 7, reader: "Dave", book_id:2 },{ _id: 8, reader: "Lily", book_id:3 }, ]); 復(fù)制代碼

相比之下,內(nèi)嵌的方式有以下優(yōu)點:

  • 使用者查詢次數(shù)減少 可以快速讀取到比較完整的相關(guān)信息
  • 使用字典對象和列表對象增加字段和成員都格外方便
  • 內(nèi)嵌文檔可以降低字段修改對調(diào)用者的影響,比如在size字段下增加一個名為"l"的子字段表示書籍長度,對于調(diào)用者來說只需要在用到時從size對象中拿出來即可,不需要再去額外獲取新的字段。 因此,在內(nèi)嵌文檔較小,更新頻率不高時推薦使用內(nèi)嵌文檔來存儲數(shù)據(jù)。

    2.內(nèi)嵌文檔為字典的查詢方法

    以1中數(shù)據(jù)為例,對于單值的字段查詢,只需要寫一個查詢字典(query filter)即可:

    db.books.find( { price: 25 } ); 復(fù)制代碼

    當(dāng)查詢條件涉及內(nèi)嵌文檔中的子字段時,使用"."(可遞進(jìn)使用):

    db.books.find( { "size.h": 8.5 } );//針對字典對象-->[{ _id: 2, name: "mongo", price: 50, size: { h: 8.5, w: 11}, reading: ["John","Dave"] },{ _id: 3, name: "webGL", price: 80, size: { h: 8.5, w: 11}, reading: ["Lily"] },]db.books.find( { "reading.0": "Tom" } );//針對列表-->[{ _id: 1, name: "python", price: 25, h: 14, w: 21, reading: ["Tom","John"] },] 復(fù)制代碼

    注意,不使用"."的話將會嚴(yán)格匹配內(nèi)嵌文檔:

    db.books.find( { "size": { h: 8.5} } );//不存在size字段為{ h: 8.5}的文檔-->[] 復(fù)制代碼

    同普通查詢一樣,可以使用運算符Query Operator

    db.books.find( { "size.w": { $lt: 21} } );-->[{ _id: 2, name: "mongo", price: 50, size: { h: 8.5, w: 11}, reading: ["John","Dave"] },{ _id: 3, name: "webGL", price: 80, size: { h: 8.5, w: 11}, reading: ["Lily"] },] 復(fù)制代碼

    3.內(nèi)嵌文檔為列表的查詢方法

    示例數(shù)據(jù)

    db.books.insertMany( [{ _id: 1, name: "python", price: 25, size: [14,21], reading: ["Tom","John"] },{ _id: 2, name: "mongo", price: 50, size: [8.5,11], reading: ["John","Dave"] },{ _id: 3, name: "webGL", price: 80, size: [8.5,11], reading: ["Lily"] }, ]); 復(fù)制代碼

    (1)指定列表{key:[value]} 列表必須符合value的條件

    以1中數(shù)據(jù)為例,指定列表,將嚴(yán)格按照所有元素及其順序查詢:

    db.books.find( { reading: ["Tom","John"]" });-->[{ _id: 1, name: "python", price: 25, size: size: [14,21], reading: ["Tom","John"] },] 復(fù)制代碼

    若只要求指定元素存在且不要求順序,使用$all:

    db.books.find( { reading: { $all: ["John"] } });-->[{ _id: 1, name: "python", price: 25, size:[14,21], reading: ["Tom","John"] },{ _id: 2, name: "mongo", price: 50, size:[8.5,11], reading: ["John","Dave"] },] 復(fù)制代碼

    (2)指定元素{key:value1,value2...} 對于各個value的條件都至少有一個元素滿足即可,不要求一個元素同時滿足所有條件

    db.books.find( { reading: "John" });//只要列表中有一元素的值為"John"即滿足-->[{ _id: 1, name: "python", price: 25, size:[14,21], reading: ["Tom","John"] },{ _id: 2, name: "mongo", price: 50, size:[8.5,11], reading: ["John","Dave"] },]db.books.find( { size: { $gt: 16, $lt: 15} });//只要列表中有一元素的值大于16,還有一元素小于15即滿足-->[{ _id: 1, name: "python", price: 25, size: [14,21], reading: ["Tom","John"] },] 復(fù)制代碼

    (3)指定元素{key:{$elemMatch:value1,value2...}} 只要至少有一元素同時符合各個value的條件

    使用$elemMatch

    db.books.find( { size: { $elemMatch: { $gt: 22, $lt: 30 } } });-->[{ _id: 1, name: "python", price: 25, size: [14,21], reading: ["Tom","John"] },] 復(fù)制代碼

    (4)指定列表長度{key:{ $size: value... }}滿足條件

    使用$size

    db.books.find( { reading: { $size: { $gt: 1} } });-->[{ _id: 3, name: "webGL", price: 80, size: [8.5,11], reading: ["Lily"] },] 復(fù)制代碼

    總結(jié),對于列表類型的內(nèi)嵌文檔,$elemMatch給出的并列條件要求至少有一個元素同時滿足,不使用elemMatch時并列的條件只需要各自至少有一個元素滿足即可。

    轉(zhuǎn)載于:https://juejin.im/post/5ce3bd415188254d1528f015

    總結(jié)

    以上是生活随笔為你收集整理的MongoDB进阶-内嵌文档查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。