Mongodb語法學習:查詢

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條件的數組元素。

相關文章
相關標籤/搜索