MongoDB入門系列(三):查詢(SELECT)

来源:https://www.cnblogs.com/chenmh/archive/2018/02/09/8426527.html
-Advertisement-
Play Games

一、概述 mongodb是最接近關係型資料庫的NOSQL資料庫,它的存儲方式非常的靈活;以至於你會將它看成是一個經過冗餘過的關係型資料庫的表,這也是Mongodb原子性的一個特征。由於沒有關係型資料庫的表之間的關聯關係和事務性所以Mongodb插入和更新的效率非常的高,同時也支持索引。我們在查詢的時 ...


一、概述

mongodb是最接近關係型資料庫的NOSQL資料庫,它的存儲方式非常的靈活;以至於你會將它看成是一個經過冗餘過的關係型資料庫的表,這也是Mongodb原子性的一個特征。由於沒有關係型資料庫的表之間的關聯關係和事務性所以Mongodb插入和更新的效率非常的高,同時也支持索引。我們在查詢的時候不能帶著關係型資料庫的思維,可以簡單的把集合看成是關係型資料庫的表、文檔看成是行、鍵看成是欄位;但是Mongodb的鍵可以是數組也可以是文檔這又像是支持xml類型的關係型資料庫的欄位。

 

 

 

版本:3.4.10

插入測試數據

db.test.insert(
[
{name:"short sleeve",
 type:10,
 size:["S","M","L"],
 buyer:{ name:"chen", city:"guangzhou" },
 saleDetial:[{dates:ISODate("2012-11-02"),price:100,sales:10},
             {dates:ISODate("2012-11-03"),price:110,sales:5},
             {dates:ISODate("2012-11-04"),price:90,sales:15}
            ]
},
{name:"coat",
 type:11,
 size:["M","L"],
 buyer:{name:"zhang", city:"shanghai"},
 saleDetial:[{dates:ISODate("2012-11-02"),price:500,sales:20},
             {dates:ISODate("2012-11-03"),price:600,sales:15},
             {dates:ISODate("2012-11-04"),price:400,sales:30}
            ]
},
{name:"fleece",
 type:12,
 size:["S","M","L"],
 buyer:{name:"wang", city:"shenzhen"},
 saleDetial:[{dates:ISODate("2012-11-02"),price:350,sales:30},
             {dates:ISODate("2012-11-03"),price:400,sales:15},
             {dates:ISODate("2012-11-04"),price:500,sales:10}
             ]
}
]
)

二、簡單查詢

1.簡單鍵

 只查詢name,type列;相當於select name,type from test

db.test.find(
{},
{"_id":0,"name":1,"type":1}
)

查詢名稱等於“coat”的數據

db.test.find(
{name:"coat"},
{"_id":0,"name":1,"type":1}
)

2.文檔嵌套數組

註意:數組的下標從0開始

1.查詢size數組的第一個元素等於M的記錄

db.test.find(
{"size.0":"M"}
)

2.查詢size數組保護M的記錄

db.test.find(
{"size":"M"}
)

3.文檔嵌套文檔

 查詢鍵buyer內嵌文檔鍵name等於“chen”的文檔

db.test.find(
{"buyer.name":"chen"}---列出文檔內的元素的方法
)
或者
db.test.find(
{"buyer":{"name":"chen", "city":"guangzhou"}}
)

註意:如果使用完整的文檔嵌套文檔的查詢方法,那麼內嵌文檔中的所有鍵值都要列出來匹配

4.文檔嵌套數組嵌套文檔

 1.查詢數組中的文檔鍵等於

db.test.find(
{"saleDetial.price":"400"}
)

2.查詢數組中第二個元素的文檔鍵等於

db.test.find(
{"saleDetial.1.price":"400"},
{"_id":0,"name":1,"type":1,"saleDetial.price":1}
)

三、運算符

1.比較運算符

MongoDB 與 RDBMS語句比較

1.查詢數組第一個元素的price大於400的文檔

db.test.find(
{"saleDetial.0.price":{$gt:400}},
{"_id":0,"name":1,"type":1,"size":1,"saleDetial":1}
)

2.$or運算符

查詢price大於500或者price小於100的文檔

db.test.find(
{$or:[{"saleDetial.price":{$gt:500}},{"saleDetial.price":{$lt:100}}]},
{"_id":0,"name":1}
)

註意:$or運算符之後是用中括弧,裡面的兩個條件分別用大括弧

3.$and運算符

1.查詢價格大於100並且size等於S的文檔名:select name from test where price>100 and size='S'

db.test.find(
{$and:[{"saleDetial.price":{$gt:100}},{"size":"S"}]},
{"_id":0,"name":1}
)
等價於
db.test.find(
{"saleDetial.price":{$gt:100},"size":"S"},
{"_id":0,"name":1}
)

對應$and預設可以省略。

註意:如果是同一個欄位的and條件必須這樣寫

db.test.find({"saleDetial.price":{$gt:300,$lt:500}})

下麵這種寫法是錯誤的,這張寫法會認為是多個鍵值的的查詢條件,最終的結果就是price>300 or price <500

db.test.find({"saleDetial.price":{$gt:300},"saleDetial.price":{$lt:500}})

4.$in運算符

相當於關係型資料庫的IN

 查詢price大於100且buyer.name是zhang,chen的文檔

db.test.find(
{$and:[{"saleDetial.price":{$gt:100}},{"buyer.name":{$in:["zhang","chen"]}}]},
{"_id":0,"name":1,"buyer":1}
)

4.$nin運算符

$nin是in的否則條件

db.test.find(
{$and:[{"saleDetial.price":{$gt:100}},{"buyer.name":{$nin:["zhang","chen"]}}]},
{"_id":0,"name":1,"buyer":1}
)

5.$mod:取模匹配運算符

相當於關係型資料庫的%運算

查詢type%2餘數為1的文檔

db.test.find(
{"type":{$mod:[2,1]}},
{"_id":0,"name":1,"buyer":1,"type":1}
)

6.$not否定運算

查詢type%2餘數不等於1的文檔

db.test.find(
{"type":{$not:{$mod:[2,1]}}},
{"_id":0,"name":1,"buyer":1,"type":1}
)

7.null值判斷

//插入測試數據

db.nullvar.insert([{"x":null},{"x":1},{"x":2}])   

//查詢null值的數據

db.nullvar.find({"x":null})

在以前2.6之前的版本查詢null值非常的麻煩,代碼如下:

db.nullvar.find({"x":{"$in":[null],"$exists":true}})

8.模糊查詢

使用正則表達式

//查詢name以包含short的文檔

db.test.find(
{"name":/short/},
{"_id":0,"name":1,"buyer":1,"type":1}
)

//查詢name以short開頭的文檔

db.test.find(
{"name":/^short/},
{"_id":0,"name":1,"buyer":1,"type":1}
)

//?查詢

db.test.find(
{"name":/^coa?t/},
{"_id":0,"name":1,"buyer":1,"type":1}
)

9.日期時間查詢

 

四、擴展操作

1.sort、skip、limit

db.test.find(
{$or:[{"saleDetial.price":{$gt:400}},{"type":{$mod:[2,0]}}]},
{"_id":0,"name":1,"buyer":1,"type":1}
)
.sort({"type":-1})
.skip(1)
.limit(10)

相當於關係型資料庫的寫法:

select name,buyer,type from test where price>400 or type%2=0
order by type desc
limit 1,10

 

 參考:http://www.runoob.com/mongodb/mongodb-query.html

 

 

 

備註:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.從官網中下載apache-tomcat-**.tar.gz文件 2.在本地文件新建一個文件夾(tomcat),在文件夾中解壓壓縮包, 不需要使用root: 3.進入解壓文件中使用命令,將tomcat中的文件全部設置添加讀寫許可權: 4. 進入tomcat的conf文件夾下,找到tomcat-use ...
  • 1、切換用戶 命令:su - paytest,回車輸入密碼。 2、查看文件系統 命令:df -a (用於查看文件系統的使用情況) 命令:du -shx * (用於列出所有文件夾的大小) 命令:df -h 顯示已經掛載的分區列表 命令:ls -lSr |more 以尺寸大小排列文件和目錄 命令:du ...
  • 集群組成: 一臺主機,一臺從節點。 系統環境: 操作系統:CentOS 7,64位,7.4.1708(/etc/redhat-release中查看) CPU:AMD Fx-8300 8核 記憶體:8GB 硬碟:120GB GNOME:3.22.2 安裝版本: GPDB:V5.4.1 GPORCA:V2 ...
  • 高級查詢 關鍵字書寫順序 關鍵字執行順序select:投影結果 1 5 from:定位到表 2 1 where:分組前第一道過濾 3 2 group by:分組 4 3 having:分組後第二道過濾 5 4 order by:排序 6 6 limit: 最後 分頁 *目的:為了加快網站對數據的查詢 ...
  • MySQL 組複製實現了基於複製協議的多主更新(單主模式)。 複製組由多個 server成員構成,並且組中的每個 server 成員可以獨立地執行事務。但所有讀寫(RW)事務只有在衝突檢測成功後才會提交。只讀(RO)事務不需要在衝突檢測,可以立即提交。 對於任何 RW 事務,提交操作並不是由始發 s ...
  • 結構語言分類 DDL(數據定義語言) create drop alter 創建刪除以及修改資料庫,表,存儲過程,觸發器,索引.... DML(數據操作語言) insert delete update 用來操作資料庫中的數據 DQL(數據查詢語言) select 用來查詢資料庫中的數據 DCL(數據控 ...
  • 背景 原文地址(http://www.cnblogs.com/wenBlog/p/8435229.html) 最近針對我們的處理器出現了一系列的嚴重的bug。這種bug導致了兩個情況,就是熔斷和幽靈。 這就是這幾天鬧得人心惶惶的CPU大Bug。消息顯示,以英特爾處理器為代表的現代CPU中,存在可以導 ...
  • http://dcx.sybase.com/1101/en/dbprogramming_en11/ianywhere-data-sqlanywhere-saconnection-getschem6330755502-0.html http://razorsql.com/articles/sybase ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...