MongoDB 之查詢詳解

2021-10-24 18:28:09 字數 3711 閱讀 2779

查詢就是獲取儲存在資料庫中的資料。

在 mongodb 中,查詢通常針對乙個集合來操作。查詢可以指定查詢條件,只返回匹配的文件;還可以指定投影項,只返回指定的字段,減少返回資料到客戶端的網路流量。

find() 方法以非結構化的方式來顯示所有文件。

mongodb 查詢資料的語法格式如下:

db.collection.

find

(query, projection)

引數說明:

query:可選,使用查詢操作符指定查詢條件。

projection:可選,使用投影操作符指定返回的鍵。查詢時返回文件中所有鍵值, 只需省略該引數即可(預設省略)。

如果你需要以易讀的方式來讀取資料,可以使用 pretty() 方法,語法格式為:

db.col.

find()

.pretty

()。

示例:

db.col.find().pretty()

除了 find() 方法之外,還有乙個 findone() 方法,它只返回乙個文件。

下面就來舉例說明多表數如何關聯的。

在關聯式資料庫 mysql 中我們可能需要設計 3 個表如客戶表 customers、訂單表 orders、商品表 products,其中 customers 表中的主鍵為 cust_id,products 表中的主鍵為prod_id,orders 表中主鍵 order_id,外來鍵 cust_id 和 prod_id 分別與客戶和產品關聯,這就是在關聯式資料庫中經常幹的事情,整個結構如下圖所示:

查詢某個客戶所訂購的所有商品名稱的 sql 語句則為以下格式:

select tl.name,t3.prod_name from customer tl 

join orders t2 on tl.cust_id = t2.cust_id

join products t3 on t2.prod_id = t3.prod_id;

在前面已經說過,mongodb中多表關聯查詢的話是沒有join的;

在 mongodb 中拋棄了這種關聯的思路來設計表結構,在 mongodb 中提倡的設計思路可能是建立乙個客戶表,在表中包含業務需要的盡可能多的資料資訊,這樣最終會產生一些冗餘資訊,但是在 nosql 的世界裡是提倡這樣做的。

與上面的業務需求相同,則最終插入的文件物件 document 結構如下所示:

db.customers.

insert(,

]},,

]}]}

);

這時使用mongodb查詢某個客戶下的所訂購的商品資訊的查詢語句則為如下格式。

db.customers.

find(,

)

上面從乙個簡單的業務需求對比了關聯式資料庫和mongodb的不同.

(2)精確匹配選擇器

返回包含鍵值對 id:91的文件。

db.customers.find()

精確匹配選擇器,但查詢條件是要返回同時匹配鍵值對 name:「lisi」

且 age:20 的文件。

db.customers.find()

(3)比較運算子。

示例:

db.customers.

find(}

)db.customers.

find(}

)db.customers.

find(}

)db.customers.

find(}

)db.customers.

find(}

)

(4)範圍選擇器

表示的是小於 120,大於或等於 119

db.customers.

find(}

)

(5)$in 和$nin

表示返回 key 的值在某些 value 範圍內

db.customers.

find(}

)

$nin 表示返回 key 的值不在某些 value 範圍內,$nin 是一種比較低效的查詢選擇器,它會進行全表掃瞄,因此最好不要單獨使用$nin

db.customers.

find(}

)

(6)邏輯運算

$or 表示或運算的選擇器,主要用於對兩個不同 key 對應的文件進行連線。

db.customers.

find(,

]

$and 表示與運算的選擇器,對於兩個不同的 key,要同時滿足條件。

db.customers.

find(,]})

(7) 巢狀查詢

巢狀查詢時匹配的 key 如果有多級巢狀深度,一級一級地用點號展開。假設系統中有如下所示的這樣一種文件型別。

,]

}

當查詢 post 等於 5 的文件時,查詢語句如下。

db.customers.

find

()

匹配字串中先取需要匹配的 key(detail),由於 detail 鍵對應的 value 為陣列,detail.1 表示要取陣列中第二個位置處的元素,又鑑於陣列的元素也是個 bson文件物件,我們可以通過 detail. 1.post 定位到需要匹配的鍵。

上面介紹的查詢選擇器用來返回匹配的文件集,有時我們需要對返回的結果集作進一步的處理,如只需要返回指定的字段,此時就可以使用到投影查詢。

db.customers.

find(,

)

此條語句執行的效果就是按照條件』detail.1.post』:5 來返回結果集,但是只選擇 id 和 name 兩個欄位的值進行顯示,同時過濾掉預設生成的_id 字段,總的來說,第乙個{}內為查詢選擇器,第二個{}內為對前面返回的結果進行進一步的過濾,即投影查詢。1 表示顯示,0 表示不顯示.

假如有乙個集合 dictgoodsattribute 具有下面結構的資料。

(1)精確匹配陣列值

我們可以通過簡單的精確匹配得到某條記錄,如以下語句所示。

db.dictgoodsattribute.

find

()

(2)匹配陣列中的乙個元素值

假如陣列有多個元素,只要這些元素中包含有這個值,就會返回這條文件,如下面語句所示。

db.dictgoodsattribute.

find

()

(3)匹配指定位置的元素值

db.dictgoodsattribute. find (

)

它表示陣列中第 0 個位置的元素值為"收腰型"的記錄才返回。

MongoDb 查詢詳解

db.inventory.insertmany status a status a status d status d status a db.inventory.find 查詢返回集合中的所有文件 db.inventory.findone 查詢返回單個文件db.inventory.find 查詢s...

shell指令碼中mongoDB查詢詳解

本篇博文主要講述,shell中查詢命令,如何跟標準sql一樣新增各種篩選條件,mongodb中游標的使用等功能,從而弄清楚,mongo是如何駕馭複雜查詢和簡單查詢的 1.基本的查詢shell命令 find 或 findone 2.使用 條件查詢 查詢特定的值 正規表示式查詢 mongodb可以為字首...

mongodb查詢之find命令

我們首先新建乙個集合 便於接下來的測試 for var i 0 i 100 i db.user.insert 指定返回的健查詢 只查詢出只包含name健的資料 db.user.find 若是希望在查詢中不包含age這個鍵的資料 db.user find 條件查詢 l t lte gt gte 就是全...