1. 集合查詢方法find()正則表達式
db.collection.find(query, projection)
query 文檔 可選. 使用查詢操做符指定查詢條件 projection 文檔 可選.使用投影操做符指定返回的鍵,(默認返回因此鍵)
返回集合中name屬性爲sean的全部文檔sql
db.posts.find({"name":"sean"}) { "_id" : ObjectId("59a6df85a95c5eb6f7267c00"), "name" : "sean", "sex" : 1, "author" : { "name" : "sean" }, "num" : 33, "house" : { "num" : 23 } } >
第一個參數若包含多個鍵/值對(逗號分隔),則至關於查詢AND組合條件,例如查詢name爲wangxiaofang且age爲25的文檔數據數組
> db.posts.find({"name":"wangxiaofang","age":25}) { "_id" : ObjectId("59a6efb26441b73551275b78"), "name" : "wangxiaofang", "age" : 25, "com" : "shanghah" }
查詢指定返回鍵的數據函數
返回集合中全部文檔的name和age字段post
db.posts.find({},{"name":1,"age":1}) { "_id" : ObjectId("59a6df85a95c5eb6f7267c00"), "name" : "sean" } { "_id" : ObjectId("59a6ee7d6441b73551275b5f"), "name" : "gaoqiumin", "age" : 30 } { "_id" : ObjectId("59a6efb26441b73551275b78"), "name" : "wangxiaofang", "age" : 25 } { "_id" : ObjectId("59a6f2576441b73551275bb6") }
若是咱們要去掉_id屬性,咱們能夠顯示的去掉code
> db.posts.find({},{"name":1,"age":1,"_id":0}) { "name" : "sean" } { "name" : "gaoqiumin", "age" : 30 } { "name" : "wangxiaofang", "age" : 25 } { }
咱們發現若是文檔中沒有要查詢的屬性,就返回一個空的文檔。ip
2. 查詢內嵌文檔rem
徹底匹配(屬性值和順序都必須相同):文檔
> db.posts.find({"auth":{"name":"xiaoxiao","car":"siyu"}}) { "_id" : ObjectId("59a6ee7d6441b73551275b5f"), "name" : "gaoqiumin", "age" : 30, "auth" : { "name" : "xiaoxiao", "car" : "siyu" } } > db.posts.find({"auth":{"car":"siyu","name":"xiaoxiao"}})
採用針對鍵/值對查詢,經過點表示法來精確表示內嵌文檔的鍵(推薦使用)字符串
> db.posts.find({"auth.name":"xiaoxiao","auth.car":"siyu"}) { "_id" : ObjectId("59a6ee7d6441b73551275b5f"), "name" : "gaoqiumin", "age" : 30, "auth" : { "name" : "xiaoxiao", "car" : "siyu" } }
查詢時若是內嵌文檔爲數組時,數組中的全部文檔會參與匹配,可能獲得的結果不是咱們想要的以下所示:
db.posts.find({"auth.name":"dada","auth.car":"yage"}) { "_id" : ObjectId("59a6ee7d6441b73551275b5f"), "name" : "gaoqiumin", "age" : 30, "auth" : [ { "name" : "xioxiao", "car" : "siyu" }, { "name" : "dada", "car" : "yage" } ] }
使用$elemMatch,能夠限定到數組中一個文檔進行匹配
{ "_id" : ObjectId("59a6ee7d6441b73551275b5f"), "name" : "gaoqiumin", "age" : 30, "auth" : [ { "name" : "xioxiao", "car" : "siyu" }, { "name" : "dada", "car" : "yage" } ] } > db.posts.find({"auth":{"$elemMatch":{"name":"dada","car":"siyu"}}})
正則表達式查詢,下面相似sql中 cname like '%kehu%',若是要不區分大小寫匹配能夠{"cname":/kehu/i}
db.getCollection('order').find({"cname":/kehu/})
3. 查詢操做符
比較操做符:
"$gt" :">"
"$gte": ">="
"$lt":"<"
"$lte":"<="
查詢age>=18 且age<=40的數據
db.test.find({"age":{"$gte":18, "$lte":40}})
"$ne":「!=」
查詢name!="sean"的數據
db.getCollection('order').find({"cname":{"$ne":"kehu1"}})
$in :判斷鍵值是否爲空或者匹配鍵值等於指定數組中任意值的文檔。相似sql中in。
$in等同於SQL中的in,下面的示例等同於SQL中的 in ("kehu1","kehu2")
db.getCollection('order').find({"cname":{"$in":["kehu1","kehu2"]}})
"$nin":匹配鍵不存在或者鍵值不等於指定數組的任意值的文檔
$nin等同於sql中的not in,下面示例等同於sql中 not in ("kehu1","kehu2")
db.getCollection('order').find({"cname":{"$nin":["kehu1","kehu2"]}})
"$or":執行邏輯OR運算,指定一個至少包含兩個表達式的數組,選擇出至少知足數組中一條表達式的文檔。
$or等同於SQL中的or,$or所針對的條件被放到一個數組中,每一個數組元素表示or的一個條件。下面示例就至關於sql找那個cname = "kehu1" or onumber="002"
db.getCollection('order').find({"$or":[{"cname":"kehu1"},{"onumber":"002"}]})
$or 和 $in 組合使用示例演示瞭如何混合使用$or和$in
db.test.find({"$or": [{"name":{"$in":["stephen","stephen1"]}}, {"age":36}]})
$exists:鍵是否存在
"$all":包含指定數組中全部元素的文檔。
"$size":用其查詢指定長度的數組
"$and" :指定一個至少包含兩個表達式的數組,選擇出知足該數組中全部表達式的文檔。$and操做符使用短路操做,若第一個表達式的值爲「false」,餘下的表達式將不會執行。
"$nor":執行邏輯NOR運算,指定一個至少包含兩個表達式的數組,選擇出都不知足該數組中全部表達式的文檔。
"$not":執行邏輯NOT運算,選擇出不能匹配表達式的文檔 ,包括沒有指定鍵的文檔
"$mod":匹配字段值對(divisor)取模,值等於(remainder)的文檔
"$regex":操做符查詢中能夠對字符串的執行正則匹配,$options(配合$regex使用)
"$where":操做符功能強大並且靈活,他能夠使用任意的JavaScript做爲查詢的一部分,包含JavaScript表達式的字符串或者JavaScript函數
$slice:操做符控制查詢返回的數組中元素的個數。
"$elemMatch(projection)":投影操做符將限制查詢返回的數組字段的內容只包含匹配elemMatch投影操做符將限制查詢返回的數組字段的內容只包含匹配elemMatch條件的數組元素。