MongoDB系列二

簡介

? ? ?MongoDB是一個基于分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。

  ?MongoDB是一個高性能,開源,無模式的文檔型數據庫,是當前NoSql數據庫中比較熱門的一種。

? ? ?MongoDB是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。他支持的數據結構非常松散,是類似 json的bjson格式,因此可以存儲比較復雜的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。

? ??傳統的關系數據庫一般由數據庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由數據庫 (database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB對于關系型數據庫里的表,但是集合中沒有列、行和關系概念,這體現了模式自由的特點。

特點

  它的特點是高性能、易部署、易使用,存儲數據非常方便。主要功能特性有:

  1)面向集合存儲,易存儲對象類型的數據。

  2)模式自由。

  3)支持動態查詢。

  4)支持完全索引,包含內部對象。

  5)支持查詢。

  6)支持復制和故障恢復。

  7)使用高效的二進制數據存儲,包括大型對象(如視頻等)。

  8)自動處理碎片,以支持云計算層次的擴展性。

  9)支持RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。

  10)文件存儲格式為BSON(一種JSON的擴展)。

  11)可通過網絡訪問。

各文件功能

Mongod.exe 是用來連接到mongo數據庫服務器的,即服務器端。

Mongo.exe 是用來啟動MongoDB shell的,即客戶端。

mongodump 邏輯備份工具。

mongorestore 邏輯恢復工具。

mongoexport? 數據導出工具。

mongoimport? 數據導入工具。

安裝MongoDB

mongod --dbpath D:\MongoDB\data --logpath=D:\MongoDB\logs\mongodb.log --logappend

MongoDB Windows環境安裝及配置? 這篇文章介紹windows下安裝MongoDB不錯

C#中使用的MongoDB DLL驅動

?MongoDB.Driver.dll:顧名思義,驅動程序

?MongoDB.Bson.dll:序列化、Json相關

下載地址?http://files.cnblogs.com/files/liyunhua/MongoDBDll.zip

最最常用命令

use cnblogs // use 命令用來切換當前數據庫,如果該數據庫不存在,則會先新建一個。
show dbs // 顯示所有數據庫
show collections // 顯示當前數據庫下的所有集合
db.users.drop() // 刪除collection 如果刪除成功會返回“true”,否則返回“false”
db.dropDatabase()//刪除當前數據庫

?

簡單的說一下增加、修改、刪除

db.users.insert({'name':'angela','sex':'feman'})// 這條命令是向users 集合中插入一條數據。如果集合users不存在,則會先新建一個,然后再插入數據,參數以JSON格式傳入。
db.users.update({'name':'xiangshu'},{'$set':{'sex':'women'}},upsert=true,multi=false)//解釋一下幾個參數: 第一:查詢的條件、 第二:更新的字段、 第三:如果不存在則插入 第四:是否允許修改多條記錄
db. users.remove({'name':'xumingxiang'})//刪除記錄  如果remove方法里面不傳入任何參數則刪除所有數據  清除集合中的所有數據,但是不會刪除集合本身以及關聯的索引
db.users.find() //查找

?細說上述update方法,上面update第三個參數是upsert,upsert操作就是說:如果我沒有查到,我就在數據庫里面新增一條,其實這樣也有好處,就是避免了我在數據庫里面判斷是update還是add操作,使用起來很簡單

默認情況下update方法是整體更新,如果需要局部更新,mongodb中已經給我們提供了兩個修改器: $inc 和 $set。

$inc修改器也就是increase的縮寫,

每次修改會在原有的基礎上自增$inc指定的值,$inc修改符將匹配條件的文檔的age鍵原子加一,缺省情況下只是更新第一條符合條件的文檔。可以通過update函數的最后一個參數來指定更新所有符合條件的文檔

$set修改直接修改匹配文檔的內容,如果修改的鍵存在則直接修改,否則新增。$unset修改符合$set的功能是完全相反的

具體復雜點的操作見Mongo學習筆記數據操作

詳述查找命令

上面例子中的findOne方法是查詢出第一條語句。

一般的查詢條件有and、or 、in、not in、not

 db.person.find({"name":"jack","age":25})//相當于查詢name="jack" and age=25
db.person.find({ $or: [{ "name": "jack", "age": 25 }] })//相當于查詢name="jack" or age=25
db.person.find({ "name": { $in: ["jack", "joe"] } })//相當于查詢name in("jack","joe")

和sql server不一樣的是MongoDB的in list中的數據可以是不同類型。

db.person.find({ "name": { $nin: ["jack", "joe"] } })//相當于查詢name not in("jack","joe")
db.person.find({ "$or": [{ "name": { "$in": ["jack", "joe"] } }, { "age": 25 }] })//如何混合使用$or和$in。
db.person.find({ "name": { "$not": { "$in": ["jack", "joe"] } } })//$not表示取反,等同于SQL中的not。

下面是查詢的相關......

 db.person.find({}, {"name":1})//返回指定的文檔鍵值對。只是返回name的鍵值對。
 db.person.find({}, {"name":0})//指定不返回的文檔鍵值對。返回除name之外的所有鍵值對。

?那如果需要查詢一些特定條件的 事實上是可以用正則的,看下面的例子。

db.person.find({ "name": /^j/, "name": /e$/ });//查詢name startwith 'j' and endwith 'e'

有些查詢很復雜的話,$where派上用場了。

db.person.find({ $where: function () { return this.name == 'jack'; } })//查詢name='jack'

?下面說說比較運算符。

$lt/$lte/$gt/$gte/$ne,依次等價于</<=/>/>=/!=。(l表示less g表示greater e表示equal n表示not ?)

?

db.person.find({ "age": { "$gte": 18, "#lte": 40 } });//返回符合條件age >= 18 && age <= 40

?

db.person.find({ "name": { "$ne": "jack" } })//返回條件符合name != "jack"

我相信大家在查詢數據的時候經常會碰到null,下面來說說null數據類型的查詢吧

db.person.find({"name":null})//在進行值為null數據的查詢時,所有值為null,以及不包含指定鍵的文檔均會被檢索出來。
db.person.find({"name": {"$in": [null], "$exists":true}})
//需要將null作為數組中的一個元素進行相等性判斷,即便這個數組中只有一個元素。再有就是通過$exists判斷指定鍵是否存在。

mongodb跟sqlserver數據查詢還是有很大不相同的一部分的,最顯著不一樣的地方就是MongoDb中的數組數據查詢。

具體來說說吧。現在假設我們數據庫里面查詢出來的數據如下圖所示:

db.test.find({"fruit":"banana"})//數組中所有包含banana的文檔都會被檢索出來。
db.test.find({"fruit": {"$all": ["banana","apple"]}})//檢索數組中需要包含多個元素的情況,這里使用$all。數組中必須同時包含apple和banana,但是他們的順序無關緊要。
db.test.find({"fruit":["apple","banana","peach"]})//精確匹配,即被檢索出來的文檔,fruit值中的數組數據必須和查詢條件完全匹配,即不能多,也不能少,順序也必須保持一致。
db.test.find({"fruit.2":"peach"})//匹配數組中指定下標元素的值。數組的起始下標是0。 查看出fruit數組中第二個元素的值為peach
db.test.find({"fruit": {$size : 3}})//可以通過$size獲取數組的長度,但是$size不能和比較操作符聯合使用。就是說查詢出fruit長度為3的...

上述的例子是查詢fruit數組長度為3的,那如果需要查詢長度大于3的應該怎么辦呢

db.test.update({}, {"$set": {"size":3}},false,true)//只能是添加一個額外的鍵表示數據中的元素數據,在操作數據中的元素時,需要同時更新size鍵的值。
test.update({},{"$push": {"fruit":"strawberry"},"$inc":{"size":1}},false,true)//$inc每次添加一個新元素,都要原子性的自增size一次。
db.test.find({},{"fruit": {"$slice":2}, "size":0})//通過$slice返回數組中的部分數據。"$slice":2表示數組中的前兩個元素。"$slice":-2表示數組中的后兩個元素。$slice : [2,1],表示從第二個2元素開始取1個,如果獲取數量大于2后面的元素數量,則取后面的全部數據。

大家都知道,MongoDB是由數據庫 (database)、集合(collection)、文檔對象(document)三個層次組成。當一個文檔對象中包含另外多個文檔對象的時候,應該怎么查詢呢?

這時候$elemMatch就有用武之地了。

假設我們數據庫里面數據如下圖所示

db.person.find({"comments": {"$elemMatch": {"author":"joe","score":{"$gte":3}}}}

?

轉載于:https://www.cnblogs.com/liyunhua/p/4621907.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375752.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過查看__cplusplus的值查看編譯器的C++標準

C03標準中&#xff0c;__cplusplus被定義為199711L&#xff0c;而在C11中&#xff0c;__clpusplus則被定義為201103L #include<iostream> using namespace std; int main(){cout<<__cplusplus<<endl;return 0; }

Oracle-數據實現豎排打印

--存放重證評分的數據表create table ZZPFapache2( ZZ_datetime DATE, --時間 ZZ_zongfen INTEGER, --總分 ZZ_shiwanglui INTEGER, --死亡率 ZZ_BINGRENID VARCHAR2(50), --病人ID ZZ_h1f1 INTEGER, --第1行1個分 ZZ_h1m1 VARCHAR2(40), ZZ_h1f2 INTEGER, --第1行…

C#時間格式

可以這樣寫: date.ToString("yyyy年MM月", DateTimeFormatInfo.InvariantInfo) 日期轉化二 DateTime dt DateTime.Now; Label1.Text dt.ToString();//2005-11-5 13:21:25 Label2.Text dt.ToFileTime().ToString();//127756416859912816 Label3.Text dt.ToFileTim…

C++11的靜態斷言

斷言就是將一個返回值總是需要為真的判別式放在語句中&#xff0c;來排除在設計的邏輯上不應該出現的情況。C11標準中引入了靜態斷言&#xff1a;static_assert 在C標準中&#xff0c;<cassert>或assert.h為我們提供了assert宏&#xff0c;但是這個宏只有在運行時才進行…

C++ 字符串編程訓練2

今天講的一道習題是很經典的約瑟夫環問題&#xff0c;其實lz對于鏈表的某些操作還不是太懂&#xff0c;所以在程序中有些地方還不太看得懂&#xff0c;這里借鑒的網上的做法&#xff0c;還請大牛能夠解答我的疑惑&#xff0c;謝謝&#xff01; 標題&#xff1a;約瑟夫環 說明&a…

linux擴展lvm磁盤

env&#xff1a; centos 6.5 x64 hyper-v虛擬機 這個方法可以在當前運行的系統中擴展root磁盤 詳細步驟 之前想創建的一個虛擬機的磁盤空間不夠用了&#xff0c;所以想擴容一下磁盤。 正好使用的時候是lvm磁盤&#xff0c;可以支持擴容。 格式化一個新的分區或者磁盤 Command…

C/C++編譯、測試須知、須會,CMake、Boost等

以下內容為本人實習期間學習筆記&#xff01;&#xff01;參考了網上的許多教程&#xff0c;共享大家&#xff0c;歡迎交流。 動態庫和靜態庫&#xff08;共享庫&#xff09; 不同點&#xff1a;代碼被載入的時刻不同 靜態庫的代碼在編譯過程中已經被載入可執行程序&#xf…

C# DataTable去除重復,極其簡便、簡單

其中sourceDT是獲取到的一個DataTable類型的集合對象 去重復使用方式&#xff1a; 實例化一個DataView對象 假設為dv&#xff0c;直接dv.ToTable()即可&#xff0c;ToTable中可為&#xff08;true,"用于判斷重復的列"&#xff09;&#xff0c;比如圖中所示&#xff0…

【轉】C++類中對同類對象private成員訪問

私有成員變量的概念&#xff0c;在腦海中的現象是&#xff0c;以private關鍵字聲明&#xff0c;是類的實現部分&#xff0c;不對外公開&#xff0c;不能在對象外部訪問對象的私有成員變量&#xff0e; 然而&#xff0c;在實現拷貝構造函數和賦值符函數時&#xff0c;在函數里利…

MySQL 導出命令

mysqldump --no-defaults -u root -p dbname > c:\www\test.sql windows 下使用。轉載于:https://www.cnblogs.com/chenshuo/p/4646070.html

ubuntu16.04編譯boost for Android(boost 1.65)

下載boost源碼 在官網下載指定版本的源碼 http://www.boost.org/users/history/ 編譯boost源碼 1.進入源碼目錄執行./bootstrap.sh生成編譯工具 2.編輯project-config.jam文件,替換如下內容 # define platform name of ndk import os ; if [ os.name ] CYGWIN || [ os.na…

Jquery獲取select,dropdownlist,checkbox下拉列表框的值

jQuery獲取 Select選擇的Text和Value:語法解釋&#xff1a;1. $("#select_id").change(function(){//code...}); //為Select添加事件&#xff0c;當選擇其中一項 時觸發2. var checkText$("#select_id").find("option:selected").text(); //獲…

maven2 + tomcat6 + eclipse集成配置

轉載&#xff1a;http://wenku.baidu.com/view/d64147c676eeaeaad1f330d4.html?review /*maven2 tomcat6 eclipse集成配置maven的配置環境變量M2_HOME maven主目錄環境變量path maven主目錄/binapache-maven/conf/setting.xml文件1、新建maven本地倉庫文件夾apache-maven2…

定位pure virtual method called問題

我是在進行boost test的時候遇到了這樣的一個問題&#xff0c;最后問題定位到測試用例中&#xff0c;測試的工程以及單元測試的代碼是之前的&#xff0c;沒有開發完&#xff0c;我實習的時候leader讓我完善一下測試框架&#xff0c;添加一下測試代碼。 目標機是Android&#x…

環形矩陣

1.逆時針 代碼&#xff1a; 1 // huanxingjz.cpp : Defines the entry point for the console application.2 //3 4 #include "stdafx.h"5 #include <stdio.h>6 #include <iostream>7 #include "windows.h"8 #define MAX 409 using namespace …

檢查MySQL主從數據一致性

未公布轉載于:https://www.cnblogs.com/cuizhipeng/p/4646489.html

統計文件里有多少個字符(only a simple cpp)

通過重定向讀取文件內容&#xff0c;并檢測其中有多少字符&#xff0c;包括空格&#xff0c;但tap鍵可能統計結果不同。 #include<iostream>int main(int argc,char *argv[]){using std::cin,std::cout,std::endl;cout<<"Usage:"<<argv[0]<<…

Winsock網絡編程筆記(4)----基本的理論知識

前面的筆記記錄了Winsock的入門編程&#xff0c;領略了Winsock編程的樂趣。。但這并不能算是掌握了Winsock&#xff0c;加深理論知識的理解才會讓后續學習更加得心應手。。因此&#xff0c;這篇筆記將記錄一些有關Winsock的基本理論知識&#xff0c;由于是一篇筆記&#xff0c;…

30分鐘學會使用grunt打包前端代碼

http://www.cnblogs.com/yexiaochai/p/3603389.html轉載于:https://www.cnblogs.com/wuxiang/p/4647280.html

簡單shell:刪除五日之前的日志文件

曾經在某公司面試的時候被問到了類似的問題。 假設在logs文件夾存放了許多日志文件 比如&#xff1a;20190204.log、20190205.log、20190206.log。。。 我們要刪除特定日期之前的日志 在這里展示的是使用shell指令中的find指令完成操作 首先看一下find指令的命令格式&#xf…