查詢就是獲取儲存在資料庫中的資料。
在 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 就是全...