數據準備 find find的第一個參數決定了要返回哪些文檔,用於指定查詢條件。要不指定查詢文檔,預設就是{},指定多個鍵/值對,相當於sql的and。第二個參數來指定想要的鍵(預設情況下,"_id"總是顯示)。 查詢條件 And查詢 使用AND型查詢時,應儘可能用最少的條件來限定結果的範圍。 當然 ...
數據準備
{ "goods_id" : 1, "goods_name" : "KD876", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : "4", "goods_name" : "諾基亞N85原裝充電器", "createTime" : ISODate("2016-09-11T00:00:00Z") } { "goods_id" : 3, "goods_name" : "諾基亞原裝5800耳機", "createTime" : ISODate("2016-10-09T00:00:00Z") } { "goods_id" : 5, "goods_name" : "索愛原裝M2卡讀卡器", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 6, "goods_name" : "勝創KINGMAX記憶體卡", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 7, "goods_name" : "諾基亞N85", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 8, "goods_name" : "飛利浦9@9v", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 9, "goods_name" : "諾基亞E66", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : "10", "goods_name" : "索愛C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 11, "goods_name" : "索愛C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 12, "goods_name" : "摩托羅拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 13, "goods_name" : "諾基亞5320", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 14, "goods_name" : "諾基亞5800XM", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : "15", "goods_name" : "摩托羅拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 16, "goods_name" : "恆基偉業G101", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 17, "goods_name" : "夏新N7", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 19, "goods_name" : "三星SGH-F258", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 20, "goods_name" : "三星BC01", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }
find
find的第一個參數決定了要返回哪些文檔,用於指定查詢條件。要不指定查詢文檔,預設就是{},指定多個鍵/值對,相當於sql的and。第二個參數來指定想要的鍵(預設情況下,"_id"總是顯示)。
查詢條件
And查詢
使用AND型查詢時,應儘可能用最少的條件來限定結果的範圍。
> db.product.find({"goods_id":"4","goods_name":"諾基亞N85原裝充電器"},{"_id":0}) { "goods_id" : "4", "goods_name" : "諾基亞N85原裝充電器", "createTime" : ISODate("2016-09-11T00:00:00Z") }
當然也可以這樣(純屬閑得蛋疼):
> db.product.find({"$and":[{"goods_id":"4","goods_name":"諾基亞N85原裝充電器"}]},{"_id":0}) { "goods_id" : "4", "goods_name" : "諾基亞N85原裝充電器", "createTime" : ISODate("2016-09-11T00:00:00Z") }
Or查詢
方式一:$in、$nin
$in可以用來查詢一個鍵的多個值,可以指定不同類型的條件和值。
$nin將返回與數組中所有條件都不匹配的文檔。
$in是對單個鍵做OR查詢。
> db.product.find({"goods_id":{"$in":["4",5,6]}},{"_id":0}) { "goods_id" : "4", "goods_name" : "諾基亞N85原裝充電器", "createTime" : ISODate("2016-09-11T00:00:00Z") } { "goods_id" : 5, "goods_name" : "索愛原裝M2卡讀卡器", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 6, "goods_name" : "勝創KINGMAX記憶體卡", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } >
方式二:$or
$or更通用一些,可以在多個鍵中查詢任意的給定值
使用$or時,第一個條件條件應儘可能匹配更多的文檔,這樣才是最為高效的。
> db.product.find({"$or":[{"goods_id":16},{"goods_name":"夏新T5"},{"createTime":{"$lt":new Date("2016-01-01")}}]},{"_id":0}) { "goods_id" : 16, "goods_name" : "恆基偉業G101", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }
$lt、 $lte、 $gt、 $gte、$eq(貌似沒什麼用)、$ne
$lt、 $lte、 $gt、 $gte、$eq、$ne分別對應sql中的<、<= 、>、>=、=、!=。組合查找一個範圍的值。
> db.product.find({"goods_id":{"$gte":3,"$lt":5}},{"_id":0} ) { "goods_id" : 3, "goods_name" : "諾基亞原裝5800耳機", "createTime" : ISODate("2016-10-09T00:00:00Z") }
> start=new Date("01/01/2016") ISODate("2015-12-31T16:00:00Z") > db.product.find({"createTime":{"$lt":start}})//查詢指定日期之前的數據 { "_id" : ObjectId("585a65d9a847c6d3a3ee1da5"), "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }
限制
查詢使用上有些限制。傳遞給資料庫的查詢文檔的值必須是常量。也就是說不能引用文檔中其他鍵的值。
db.product.find({"goods_id":this.goods_name}).pretty()
$mod
取模運算符,會將查詢的值除以第一個給定值,若餘數等於第二個給定的值則匹配成功。
> db.product.find({"goods_id":{"$mod":[5,1]}},{"_id":0}) { "goods_id" : 1, "goods_name" : "KD876", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 6, "goods_name" : "勝創KINGMAX記憶體卡", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 11, "goods_name" : "索愛C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 16, "goods_name" : "恆基偉業G101", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } >
$not
$not是元條件句,即可以用在其他任何其他條件之上。查詢和匹配的件相反的數據。
$not與正則表達式聯合使用時極為有用,用來查找那些與特定模式不匹配的文檔。
> db.product.find({"goods_id":{"$not":{"$mod":[5,1]}}},{"_id":0}) { "goods_id" : "4", "goods_name" : "諾基亞N85原裝充電器", "createTime" : ISODate("2016-09-11T00:00:00Z") } { "goods_id" : 3, "goods_name" : "諾基亞原裝5800耳機", "createTime" : ISODate("2016-10-09T00:00:00Z") } { "goods_id" : 5, "goods_name" : "索愛原裝M2卡讀卡器", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 7, "goods_name" : "諾基亞N85", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 8, "goods_name" : "飛利浦9@9v", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 9, "goods_name" : "諾基亞E66", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : "10", "goods_name" : "索愛C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 12, "goods_name" : "摩托羅拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 13, "goods_name" : "諾基亞5320", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 14, "goods_name" : "諾基亞5800XM", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : "15", "goods_name" : "摩托羅拉A810", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 17, "goods_name" : "夏新N7", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 19, "goods_name" : "三星SGH-F258", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 20, "goods_name" : "三星BC01", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z") }
條件語義
在查詢中,$lt在內層文檔,而在更新中$inc則是外層文檔的鍵。
基本可以肯定:條件語句是內層文檔的鍵,而修改器則是外層文檔的鍵。
一個鍵可以有任意多個條件,但是一個鍵不能對應多個更新修改器。
有一些”元操作符”也位於外層文檔中,比如$and、$or、$nor
查詢優化器不會$and進行優化,這與其他操作符不相同。
特定類型的查詢
null
null不僅會匹配某個鍵的值為null的文檔,而且還會匹配不含這個鍵的文檔。
如果僅想匹配鍵值為null的文檔,既要檢查該鍵的值是否為null,還要通過$exists條件判斷鍵值已存在。
> db.product.update({"goods_id":2},{"$set":{"goods_name":null}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.product.find({"goods_name":null},{"_id":0}) { "goods_id" : 2, "createTime" : ISODate("2015-10-01T00:00:00Z"), "goods_name" : null }
> db.product.find({"goods_no":{"$in":[null],"$exists":true}},{"_id":0})
正則表達式
正則表達式能夠靈活有效地匹配字元串,系統可以接收正則表達式標誌i (忽略大小寫),但不一定要有。
MongoDB可以為首碼型正則表達式(比如:/^joey/)查詢創建索引,所以這種類型的查詢會非常高效。
> db.product.find({"goods_name":/^三星/},{"_id":0}) { "goods_id" : 19, "goods_name" : "三星SGH-F258", "createTime" : ISODate("2016-12-21T11:19:39.010Z") } { "goods_id" : 20, "goods_name" : "三星BC01", "createTime" : ISODate("2016-12-21T11:19:39.010Z") }
正則表達式也可以匹配自身。
> db.product.find({"goods_name":/baz/},{"_id":0}) { "goods_id" : 3, "goods_name" : /baz/, "createTime" : ISODate("2016-10-09T00:00:00Z") }
查詢數組
查詢數組元素與查詢標量值是一樣的。
> db.product.update({"goods_id":"10"},{"$push":{"goods_type":{"$each":["華為", "樂視", "小米"]}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.product.find({"goods_type":"小米"},{"_id":0}) { "goods_id" : "10", "goods_name" : "索愛C702c", "createTime" : ISODate("2016-12-21T11:19:39.010Z"), "goods_type" : [ "華為", "樂視", "小米" ] }
$all
通過多個元素來匹配數組,這樣就會匹配一組元素。
> db.product.update({"goods_id":20},{"$push":{"goods_type":{"$each":["三星", "蘋果", "努比亞"]}}})> db.product.update({"goods_id":18},{"$push":{"goods_type":{"$each":["華為", "蘋果", "魅族"]}}}) > db.product.find({"goods_type":{"$all":["蘋果","華為"]}},{"_id":0}) { "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z"), "goods_type" : [ "華為", "蘋果", "魅族" ] }
當然也可以使用整個數組進行精確匹配。但是,精確匹配必須一模一樣的才查的出來,比如順序,個數都得一樣。
> db.product.find({"goods_type":["華為","蘋果","魅族"]},{"_id":0}) { "goods_id" : 18, "goods_name" : "夏新T5", "createTime" : ISODate("2016-12-21T11:19:39.010Z"), "goods_type" : [ "華為", "蘋果", "魅族" ] }
查找特定位置的元素
要想查詢數組特定位置的元素,需使用key.index語法指定下標,數組下標都是從0開始的。
> db.product.find({"goods_type.1":"蘋果"},{"_id":0}) { "goods_id" : 18, "goods_name" : "夏