在本章中,我們將學(xué)習(xí)如何從MongoDB集合中查詢文檔。
要查詢MongoDB集合中的數(shù)據(jù),您需要使用MongoDB的find()方法。
find()方法的基本語法如下-
>db.COLLECTION_NAME.find()
find() 方法將以非結(jié)構(gòu)化方式顯示所有文檔。
假設(shè)我們已經(jīng)創(chuàng)建了一個名為 mycol 的集合-
> use sampleDB switched to db sampleDB > db.createCollection("mycol") { "ok" : 1 } >
并使用insert()方法在其中插入3個文檔,如下所示-
> db.mycol.insert([ { title: "MongoDB Overview", description: "MongoDB不是SQL數(shù)據(jù)庫", by: "基礎(chǔ)教程", url: "", tags: ["mongodb", "database", "NoSQL"], likes: 100 }, { title: "NoSQL Database", description: "NoSQL數(shù)據(jù)庫沒有表", by: "基礎(chǔ)教程", url: "", tags: ["mongodb", "database", "NoSQL"], likes: 20, comments: [ { user:"user1", message: "My first comment", dateCreated: new Date(2013,11,10,2,35), like: 0 } ] } ])
以下方法檢索集合中的所有文檔-
> db.mycol.find() { "_id" : ObjectId("5dd4e2cc0821d3b44607534c"), "title" : "MongoDB Overview", "description" : "MongoDB不是SQL數(shù)據(jù)庫", "by" : "基礎(chǔ)教程", "url" : "", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } { "_id" : ObjectId("5dd4e2cc0821d3b44607534d"), "title" : "NoSQL Database", "description" : "NoSQL數(shù)據(jù)庫沒有表", "by" : "基礎(chǔ)教程", "url" : "", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 20, "comments" : [ { "user" : "user1", "message" : "My first comment", "dateCreated" : ISODate("2013-12-09T21:05:00Z"), "like" : 0 } ] } >
要以格式化的方式顯示結(jié)果,可以使用pretty()方法。
>db.COLLECTION_NAME.find().pretty()
以下示例從名為 mycol 的集合中檢索所有文檔,并以易于閱讀的格式排列它們。
> db.mycol.find().pretty() { "_id" : ObjectId("5dd4e2cc0821d3b44607534c"), "title" : "MongoDB Overview", "description" : "MongoDB不是SQL數(shù)據(jù)庫", "by" : "基礎(chǔ)教程", "url" : "", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } { "_id" : ObjectId("5dd4e2cc0821d3b44607534d"), "title" : "NoSQL Database", "description" : "NoSQL數(shù)據(jù)庫沒有表", "by" : "基礎(chǔ)教程", "url" : "", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 20, "comments" : [ { "user" : "user1", "message" : "My first comment", "dateCreated" : ISODate("2013-12-09T21:05:00Z"), "like" : 0 } ] }
除了find()方法外,還有一種findOne()方法僅返回一個文檔。
>db.COLLECTIONNAME.findOne()
以下示例檢索標題為MongoDB Overview的文檔。
> db.mycol.findOne({title: "MongoDB Overview"}) { "_id" : ObjectId("5dd6542170fb13eec3963bf0"), "title" : "MongoDB Overview", "description" : "MongoDB不是SQL數(shù)據(jù)庫", "by" : "基礎(chǔ)教程", "url" : "", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
要根據(jù)某些條件查詢文檔,可以使用以下操作。
操作 | 格式 | 范例 | RDBMS中的類似語句 |
---|---|---|---|
等于 | {<key>:<value>} | db.col.find({"by":"基礎(chǔ)教程"}).pretty() | where by = '基礎(chǔ)教程' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
值在數(shù)組中 | {<key>:{$in:[<value1>, <value2>,……<valueN>]}} | db.mycol.find({"name":{$in:["Raj", "Ram", "Raghu"]}}).pretty() | 其中name與其中的任何值匹配 :["Raj", "Ram", "Raghu"] |
值不在數(shù)組中 | {<key>:{$nin:<value>}} | db.mycol.find({"name":{$nin:["Ramu", "Raghav"]}}).pretty() | name 值不在數(shù)組中 :["Ramu", "Raghav"] 或者,根本不存在 |
要基于AND 條件查詢文檔,您需要使用$and 關(guān)鍵字。以下是AND的基本語法-
>db.mycol.find({ $and: [ {<key1>:<value1>}, { <key2>:<value2>} ] })
下面的實例將顯示所有的教程由“ 基礎(chǔ)教程”編寫的教程和標題為“ MongoDB Overview”。
> db.mycol.find({$and:[{"by":"基礎(chǔ)教程"},{"title": "MongoDB Overview"}]}).pretty() { "_id" : ObjectId("5dd4e2cc0821d3b44607534c"), "title" : "MongoDB Overview", "description" : "MongoDB不是SQL數(shù)據(jù)庫", "by" : "基礎(chǔ)教程", "url" : "", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } >
對于上面給出的示例,等效 where 子句將為' where by = '基礎(chǔ)教程' AND title = 'MongoDB Overview' '。您可以在find子句中傳遞任意數(shù)量的鍵,值對。
要基于“OR”條件查詢文檔,需要使用$or關(guān)鍵字。以下是OR的基本語法:
>db.mycol.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
以下示例將顯示所有由“ tutorials point”編寫或標題為“ MongoDB Overview”的教程。
>db.mycol.find({$or:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty() { "_id": ObjectId(7df78ad8902c), "title": "MongoDB Overview", "description": "MongoDB不是SQL數(shù)據(jù)庫", "by": "基礎(chǔ)教程", "url": "", "tags": ["mongodb", "database", "NoSQL"], "likes": "100" } >
下面的示例將顯示點贊(likes)大于10且標題為“ MongoDB概述”或 by為“ 基礎(chǔ)教程”的文檔。等效于SQL where子句為 'where likes>10 AND (by = '基礎(chǔ)教程' OR title = 'MongoDB概述')'
>db.mycol.find({"likes": {$gt:10}, $or: [{"by": "tutorials point"}, {"title": "MongoDB Overview"}]}).pretty() { "_id": ObjectId(7df78ad8902c), "title": "MongoDB概述", "description": "MongoDB不是SQL數(shù)據(jù)庫", "by": "基礎(chǔ)教程", "url": "", "tags": ["mongodb", "database", "NoSQL"], "likes": "100" } >
要根據(jù)NOR條件查詢文檔,需要使用$nor關(guān)鍵字。以下是NOR的基本語法:
>db.COLLECTION_NAME.find( { $nor: [ {key1: value1}, {key2:value2} ] } )
假設(shè)我們在集合 empDetails 中插入了3個文檔,如下所示-
db.empDetails.insertMany( [ { First_Name: "Radhika", Last_Name: "Sharma", Age: "26", e_mail: "radhika_sharma.123@gmail.com", phone: "9000012345" }, { First_Name: "Rachel", Last_Name: "Christopher", Age: "27", e_mail: "Rachel_Christopher.123@gmail.com", phone: "9000054321" }, { First_Name: "Fathima", Last_Name: "Sheik", Age: "24", e_mail: "Fathima_Sheik.123@gmail.com", phone: "9000054321" } ] )
以下示例將檢索名字不是“ Radhika”且名字也不是“ Christopher”的文檔
> db.empDetails.find( { $nor:[ 40 {"First_Name": "Radhika"}, {"Last_Name": "Christopher"} ] } ).pretty() { "_id" : ObjectId("5dd631f270fb13eec3963bef"), "First_Name" : "Fathima", "Last_Name" : "Sheik", "Age" : "24", "e_mail" : "Fathima_Sheik.123@gmail.com", "phone" : "9000054321" }
要根據(jù)NOT條件查詢文檔,您需要使用$not關(guān)鍵字,以下是NOT基本語法:
>db.COLLECTION_NAME.find( { $NOT: [ {key1: value1}, {key2:value2} ] } ).pretty()
以下示例將檢索年齡不超過25歲的文檔
> db.empDetails.find( { "Age": { $not: { $gt: "25" } } } ) { "_id" : ObjectId("5dd6636870fb13eec3963bf7"), "First_Name" : "Fathima", "Last_Name" : "Sheik", "Age" : "24", "e_mail" : "Fathima_Sheik.123@gmail.com", "phone" : "9000054321" }