1. 程式人生 > >MongoDB資料庫查詢方法

MongoDB資料庫查詢方法

 本文將介紹操作符的使用,配合操作符,我們可以執行更加複雜的操作。

目錄

  1. 集合查詢方法find()
  2. 查詢內嵌文件
  3. 查詢操作符(內含 陣列查詢)
    gt""gte”、 “lt""lte”、”null查詢”、”all""size”、”in""nin”、
    and""nor”、”not""or”、”exists""mod”、”regex""where”、”slice""elemMatch”

1.1 集合查詢方法 find()

db.collection.find() 查詢集合中文件並返回結果為遊標的文件集合。

語法:db.collection.find(query, projection)

引數      型別     描述
query     文件   可選. 使用查詢操作符指定查詢條件
projection   文件  可選.使用投影操作符指定返回的鍵。查詢時返回文件中所有鍵值, 只需省略該引數即可(預設省略).

返回值: 匹配查詢條件的文件集合的遊標. 如果指定投影引數,查詢出的文件返回指定的鍵 ,”_id”鍵也可以從集合中移除掉。

 
注意:在mongo shell中我們不需要JavaScript遊標處理方法就可以直接訪問作為查詢結果的文件集合。mongo shell預設返回遊標中的前20條文件。當執行查詢操作時,mongo shell直接自動的對遊標執行迭代操作並顯示前20條文件。輸入”it”顯示接下來的20條文件。

  find的第一個引數是查詢條件,其形式也是一個文件,決定了要返回哪些文件,空的査詢文件{}會匹配集合的全部內容。要是不指定査詢文件,預設就是{},如同SQL中”SELECT * FROM TABLENAME”語句。

//將返回集合中所有文件
db.collection.find()
//或者
db.collection.find({})

  第一個引數若為鍵/值對時,查詢過程中就意味著執行了條件篩選,就如同我們使用Linq查詢資料庫一樣。下面查詢操作將返回user集合中age鍵值為16的文件集合。

//mongo db
db.user.find({age:16})

//Linq to sql
dbContext.user.select(p=>p.age==16)
  上面的查詢預設執行“==”操作(就如同linq中 p.age==16),文件中若存在相同鍵的值和查詢文件中鍵的值相等的話,就會返回該文件。

  第一個引數若包含多個鍵/值對(逗號分隔),則相當於查詢AND組合條件,“條件1 AND條件2 AND…AND 條件N”.例如查詢年齡為28且性別為男性的文件集合:

//mongo db
db.user.find({age:28,sex:"male"})

//Linq to sql
dbContext.user.select(p=>p.age==28&&p.sex=="male")

//SQL
SELECT * FROM user WHERE age=28 AND sex="male"

指定返回的鍵

  我們可以通過find 的第二個引數來指定返回的鍵。

  若find不指定第二個引數,查詢操作預設返回查詢文件中所有鍵值。像SQL中我們可以指定查詢返回欄位一樣 ,mongo中也可以指定返回的鍵,這樣我們就可以避免查詢無用鍵值查詢所消耗的資源、會節省傳輸的資料量和記憶體消耗。

db.users.find({}, {“name” : 1, “age” : 1})

  上面查詢結果中,”_id”這個鍵總是被返回,即便是沒有指定也一樣。但是我們可以顯示的將其從查詢結果中移除掉。

db.users.find({}, {“name” : 1, “age” : 1, “_id”:0})

這裡寫圖片描述
  在第二個引數中,指定鍵名且值為1或者true則是查詢結果中顯示的鍵;若值為0或者false,則為不顯示鍵。文件中的鍵若在引數中沒有指定,查詢結果中將不會顯示(_id例外)。這樣我們就可以靈活顯示宣告來指定返回的鍵。

  我們在使用RDMS時,有時會對錶中多個欄位之間進行比較。如表store中,有銷售數量soldnum和庫存數量stocknum兩個欄位,我們要查詢表中銷售數量等於庫存數量的記錄時可以使用下面的sql語句:

SELECT * FROM store WHERE soldnum=stocknum

  那麼換成mongodb呢,使用find()能實現類似的功能嗎?

db.store.find ({ “soldnum” : “stocknum”})
//或者
db.store.find ({ “stocknum”:”soldnum” })

結果是不行的!!我們可以使用$where運算子來進行相應的操作。

1.2 查詢內嵌文件
  查詢文件有兩種方式,一種是完全匹查詢,另一種是針對鍵/值對查詢。

db.profile.find()
{ “_id” : ObjectId(“51d7b0d436332e1a5f7299d6”), “name” : { “first” : Barack”, “last” : “Obama” } }

  內嵌文件的完全匹配查詢和陣列的完全匹配查詢一樣,內嵌文件內鍵值對的數量,順序都必須一致才會匹配:

db.profile.find({ name : { first : “Barack”, last : “Obama” } });
{ “_id” : ObjectId(“51d7b0d436332e1a5f7299d6”), “name” : { “first” : Barack”, “last” : “Obama” } }

//無任何返回值
db.profile.find({ name : { last : “Obama” , first : “Barack”} });

  推薦採用針對鍵/值對查詢,通過點表示法來精確表示內嵌文件的鍵:

//查詢結果一樣
db.profile.find({ “name.first” : “Barack” , “name.last” : “Obama”});
//或者
db.profile.find({ “name.last” : “Obama” , “name.first” : “Barack”} );
  執行結果:
這裡寫圖片描述

査詢文件可以包含點,來表達“深入內嵌文件內部”的意思,點表示法也是待插入的文件不能包含的原因。當內嵌文件變得複雜後,如鍵的值為內嵌文件的陣列,內嵌文件的匹配需要些許技巧,例如使用$elemMatch操作符。

集合blogs有如下文件:

{
        "content" : ".....",
        "comment" : [
                {
                        "author" : "zhangsan",
                        "score" : 3,
                        "comment" : "shafa!"
                },
                {
                        "author" : "lisi",
                        "score" : 5,
                        "comment" : "lzsb!"
                }
        ]
}

我們想查詢評論中使用者“zhangsan”是否有評分超過4分的評論內容,但我們利用“點表示法”直接寫是有問題的,這條查詢條件和陣列中不同的文件進行了匹配!

db.blogs.find({“comment.author”:”zhangsan”, “comment.score”:{“$gte”:4}});

這裡寫圖片描述
上面的結果不是我們期望的,下面使用“$elemMatch”操作符即可將一組條件限定到陣列中單條文件的匹配上:

db.blogs.find({“comment”:{“elemMatch":{"author":"zhangsan","score":{"gt”:4}}}});
db.blogs.find({“comment”:{“elemMatch":{"author":"zhangsan","score":{"gt”:2}}}});

這裡寫圖片描述

1.3 查詢操作符  
  下面我們將配合查詢操作符來執行復雜的查詢操作,比如元素查詢、 邏輯查詢 、比較查詢操作。 

  我們使用下面的比較操作符”gt""gte”、 “lt""lte”(分別對應”>”、 “>=” 、”<” 、”<=”),組合起來進行範圍的查詢。例如查詢年齡為16-18歲(包含16但不含18)的使用者:

db.user.find( { age: { gte:16,lt:18} }

我們可以使用”$ne”來進行”不相等”操作。例如查詢年齡不為18歲的使用者:

db.user.find( { age: {$ne:18} }

精確匹配日期要精確到毫秒,然而我們通常只是想得到關於一天、一週或者是一個月的資料,我們可以使用”gt”、”gt”、”lt”進行範圍査詢。例如,要査找在1990年1月1日出生的使用者:

start = new Date(“1990/01/01”)
db.users.find({“birthday” : {“$lt” : start}})

鍵值為null查詢操作

  如何檢索出sex鍵值為null的文件,我們使用”in”、”in”、”where”操作符,”in"null,"exists”判定集合中文件是否包含該鍵。

//集合中有一條sex鍵值為null的文件
{"name":"xiaoming","age":20,"sex":"male"}
{"name":"xiaohong","age":22,"sex":"female"}
{"name":"lilei","age":24,"sex":null}

//返回文件中存在sex鍵,且值為null的文件  
db.users.find({sex:{$in:[null],$exists:true }})

//返回文件中存在birthday鍵,且值為null的文件 
//文件沒有birthday鍵,所以結果為空
db.users.find({birthday:{$in:[null],$exists:true }})

  執行截圖:

這裡寫圖片描述

  我們也可以執行如下語句:

db.users.find({sex:null})
  查詢結果跟語句”db.users.find({sex:{in:[null],in:[null],exists:true }})”一樣

這裡寫圖片描述

  但是當為我們執行下面語句時,發現查詢結果跟語句”db.users.find({birthday:{in:[null],in:[null],exists:true }})”不一樣!

db.users.find({birthday:null})
  查詢返回了所有的文件!

這裡寫圖片描述

  因為null不僅僅匹配自身,而且匹配鍵“不存在的”文件,集合眾文件都不存在”birthday”鍵,都匹配查詢條件,所以上面的語句會返回所有的文件!

  我們最好使用db.users.find({sex:{in:[null],in:[null],exists:true }})這種格式。

  下面先向集合inventory插入3條資料(下面的演示基於此資料),文件內容如下:

{“name”:”t1”,”amount”:16,”tags”:[ “school”, “book”, “bag”,
“headphone”, “appliances” ]}   {“name”:”t2”,”amount”:50,”tags”:[
“appliances”, “school”, “book” ]}   {“name”:”t3”,”amount”:58,”tags”:[
“bag”, “school”, “book” ]}

這裡寫圖片描述

“$all”

  匹配那些指定鍵的鍵值中包含陣列,而且該陣列包含條件指定陣列的所有元素的文件,陣列中元素順序不影響查詢結果。

語法: { field: { $all: [ , … ] }
  查詢出在集合inventory中 tags鍵值包含陣列,且該陣列中包含appliances、school、 book元素的所有文件:

db.inventory.find( { tags: { $all: [ "appliances", "school", "book" ] } } )

  該查詢將匹配tags鍵值包含如下任意陣列的所有文件:

[ “school”, “book”, “bag”, “headphone”, “appliances” ] [ “appliances”,
“school”, “book” ]

  查詢結果:

這裡寫圖片描述

  文件中鍵值型別不是陣列,也可以使用all"all”對應的陣列只有一個值,那麼和直接匹配這個值效果是一樣的。

//查詢結果是相同的,匹配amount鍵值等於50的文件
db.inventory.find( { amount: {$all:[50]}} )
db.inventory.find( { amount: 50}} )

這裡寫圖片描述

  要是想查詢陣列指定位置的元素,則需使用key.index語法指定下標,例如下面查詢出tags鍵值陣列中第2個元素為”school”的文件:

db.inventory.find({“tags.1”:”school”})
  陣列下標都是從0開始的,所以查詢結果返回陣列中第2個元素為”school”的文件:

這裡寫圖片描述

“$size”

  用其查詢指定長度的陣列。
語法:{field: {$size: value} }
  查詢集合中tags鍵值包含有3個元素的陣列的所有文件:

db.inventory.find({tags:{$size:3}})
  文件”{“name”:”t1”,”amount”:16,”tags”:[ “school”, “book”, “bag”, “headphone”, “appliances” ]}”,tags鍵值陣列包含四個元素,所以不匹配查詢條件。查詢結果:

這裡寫圖片描述

  size必須制定一個定值,不能接受一個範圍值,不能與其他查詢子句組合(比如”size必須制定一個定值,不能接受一個範圍值,不能與其他查詢子句組合(比如”gt”)。但有時查詢需求就是需要一個長度範圍,這種情況建立一個計數器欄位,當你增加元素的同時增加計數器欄位值。

//每一次向指定陣列新增元素的時候,"count"鍵值增加1(充當計數功能)
db.collection.update({ $push : {field: value}, $inc :{count : 1}})
//比較count鍵值實現範圍查詢
db.collection.find({count : {$gt:2}})

“$in”

  匹配鍵值等於指定陣列中任意值的文件。類似sql中in.

語法: { field: { in: [<value1>, <value2>, ... <valueN> ] } } "nin”

  匹配鍵不存在或者鍵值不等於指定陣列的任意值的文件。類似sql中not in(SQL中欄位不存在使用會有語法錯誤).

語法: { field: { $nin: [ , … ]} }

 查詢出amount鍵值為16或者50的文件:

db.inventory.find( { amount: { $in: [ 16, 50 ] } } )

這裡寫圖片描述

//查詢出amount鍵值不為16或者50的文件
db.inventory.find( { amount: { $nin: [ 16, 50 ] } } )
//查詢出qty鍵值不為16或50的文件,由於文件中都不存在鍵qty,所以返回所有文件
db.inventory.find( { qty: { $nin: [ 16, 50 ] } } )

這裡寫圖片描述

  文件中鍵值型別不是陣列,也可以使用all"in”對應的陣列只有一個值,那麼和直接匹配這個值效果是一樣的。

//查詢結果是相同的,匹配amount鍵值等於50的文件
db.inventory.find( { amount: {$in:[50]}} )
db.inventory.find( { amount: 50}} )

“$and”

  指定一個至少包含兩個表示式的陣列,選擇出滿足該陣列中所有表示式的文件。$and操作符使用短路操作,若第一個表示式的值為“false”,餘下的表示式將不會執行。

語法: { $and: [ { }, { } , … , {
} ] }

  查詢name鍵值為“t1”,amount鍵值小於50的文件:

db.inventory.find({ and: [ { name: "t1" }, { amount: {lt:50 } } ] }
)

這裡寫圖片描述

  對於下面使用逗號分隔符的表示式列表,MongoDB會提供一個隱式的$and操作:

//等同於{ $and: [ { name: "t1" }, { amount: { $lt50 } } ] }
 db.inventory.find({ name: "t1" , amount: { $lt50 }} )

這裡寫圖片描述
  

“$nor”

  執行邏輯NOR運算,指定一個至少包含兩個表示式的陣列,選擇出都不滿足該陣列中所有表示式的文件。

語法: { $nor: [ { }, { }, … {
} ] }

  查詢name鍵值不為“t1”,amount鍵值不小於50的文件:

db.inventory.find( { nor: [ { name: "t1" }, { qty: {lt: 50 } } ] }
)

這裡寫圖片描述
  

  若是文件中不存在表示式中指定的鍵,表示式值為false; false nor false 等於 true,所以查詢結果返回集合中所有文件:

db.inventory.find( { nor: [ { sale: true }, { qty: {lt: 50 } } ] }
)

這裡寫圖片描述

“$not”

  執行邏輯NOT運算,選擇出不能匹配表示式的文件 ,包括沒有指定鍵的文件。not使使regex)。

語法: { field: { $not: { } } }

  查詢amount鍵值不大於50(即小於等於50)的文件資料

db.inventory.find( { amount: { not: {gt: 50 } } } )
//等同於db.inventory.find( { amount: { $lte: 50 } } )

這裡寫圖片描述

  查詢條件中的鍵gty,文件中都不存在無法匹配表示,所以返回集合所有文件資料。

db.inventory.find( { gty: { not: {gt: 50 } } } )

這裡寫圖片描述

“$or”

  執行邏輯OR運算,指定一個至少包含兩個表示式的陣列,選擇出至少滿足陣列中一條表示式的文件。

語法: { $or: [ { }, { }, … , {
} ] }

  查詢集合中amount的鍵值大於50或者name的鍵值為“t1”的文件:

db.inventory.find( { or: [ { amount: {gt: 50 } }, { name: “t1” } ]
} )

這裡寫圖片描述

“$exists”

  如果exists

相關推薦

MongoDB資料庫查詢方法

 本文將介紹操作符的使用,配合操作符,我們可以執行更加複雜的操作。 目錄 集合查詢方法find() 查詢內嵌文件 查詢操作符(內含 陣列查詢) “gt"、"gte”、 “lt"、"lte”、”null查詢”、”all"、"size”、”in"、"n

Koa2學習之旅----mongodb資料庫查詢分頁資訊

db.表名.find().skip((page-1)*pageSize).limit(pageSize) db.collection(collectionName).find(json1,{fields:attr}).skip(slipNum).limit(pageSize); fi

MongoDB 資料庫使用方法

MongoDB 資料庫 這是一個數據庫,與MySQL(關係型資料庫)的區別就是,它是一個非關係型資料庫 NoSql資料庫 關係型資料庫和非關係型資料庫的區別 1.實質。 非關係型資料庫的實質:非關係型資料庫產品是傳統關係型資料庫的功能閹割版本,通過減少用不到或很少用的功能,來

MongoDB資料庫查詢詳解

今天詳細講 增刪改查 中的查詢。 提前準備好了一個數據檔案,大家可以自己寫一個: 一、查詢全部資料:db.persons.find() 把它複製到命令列中會自動新增到資料中,使用db.persons.find()之後所有資料都展示出來了。 二、查詢指定的鍵對應的資訊:d

C# MongoDB Query查詢方法

用的是NuGet裡的 Mongo 包 MongoDB.Bson.dll MongoDB.Driver.dll using MongoDB.Driver.Builders; Query.All("nam

python django 資料庫查詢方法總結

__exact 精確等於 like ‘aaa’ __iexact 精確等於 忽略大小寫 ilike ‘aaa’ __contains 包含 like ‘%aaa%’ __icontains 包含 忽略大小寫 ilike ‘%aaa%’,但是對於sqli

C++Builder 資料庫 查詢方法

## C++Builder 資料庫 ## 1、拖一個ADOConnection 和一個ADOQuery ,一個DBGrid,一個DataSource 2、在工程目錄下建立一個ACCESS 資料庫檔案。 3、設定ADO Connection屬性為: 提供

Symfony2 Doctrine 資料庫查詢方法總結

預定義文中用到的變數: $em = $this->getDoctrine()->getEntityManager(); $repository = $em->getRepository(‘AcmeStoreBundle:Product’) 1、基本方法 $repository->fi

java--關於樹的資料庫查詢方法

本篇主要講了關於一個表存放樹的資料庫表的查詢方法: 利用JSON查詢: 首先從資料庫查詢該表的所有資訊: public JSONArray fromatAll() { JSONArray jsonArray = new JSONArra

關於mongodb按照字段模糊查詢方法

bsp regex name mongodb bin mongo reg 字段 options 關於mongodb按照字段模糊查詢方法 模糊查詢:tname包含某個關鍵字測試‘ cd /opt/soft/mongodb/bin ./mongo --host 192.16

JDBC資料庫連線池連線資料庫資料庫操作DAO層設計通用更新及查詢方法(二)

上篇文章主要介紹了通過資料庫連線池連線資料庫,然後設計了對資料庫通用更新和查詢方法,本篇文章主要通過例項介紹上篇文章定義的對資料庫操作的幾個方法的使用:     首先我們先在資料庫建立一個學生資訊表Student欄位如圖: 建立好表將配置檔案的資訊改好然後需要建立一

JDBC資料庫連線池連線資料庫資料庫操作DAO層設計通用更新及查詢方法(一)

該篇文章介紹了資料庫連線池獲取資料庫連線以及資料庫操作的基本使用,然後主要提供了java專案案例中dao層的一種設計,利用反射的原理定義了通用的查詢方法可以對應所有的表和例項。文章中的每段程式碼都提供了詳細的註釋及邏輯步驟 首先匯入資料庫連線的所需要的jar包:    

python呼叫mongodb資料庫方法

自己實現的python呼叫mongodb資料庫方法,可支援一鍵匯入本地資料庫,一鍵寫入json檔案,並將查詢的複雜式子簡化。 from pymongo import * import json import sys import time import datetime '''

python連線MongoDB資料庫方法及增刪改查等操作小結。

Y9   建議安裝MongoDB視覺化工具“Robo 3T”,可以很直觀的看到對MongoDB操作後的資料。 1、‘Robo 3T’的安裝,網上很多途徑可下載,在此分享我使用的版本: 連結:https://pan.baidu.com/s/1EcjmUVkXz1GQeTXy2fMk

資料庫優化查詢方法總結

處理百萬級以上的資料提高查詢速度的方法: 1.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order_by 涉及的列上建立索引。 3.應儘量避免在 wh

瞭解SQLPLUS連線資料庫方法 ,掌握SQLPLUS設定環境變數的操作方法 ,掌握利用SQLPLUS格式化查詢結果的方法 ,掌握常用的SQLPLUS命令,掌握在SQLPLUS編寫及運

撰寫人——軟工二班——陳喜平 – 實驗步驟: – 1、利用SQLPLUS連線oracle資料庫 sqlplus s16436220/[email protected] – 2、設定SQLPLUS的環境變數 – pagesize – linesize show p

使用scrapy框架,用模擬瀏覽器的方法爬取京東上面膜資訊,並存入mysql,sqlite,mongodb資料庫

因為京東的頁面是由JavaScript動態載入的所以使用模擬瀏覽器的方法進行爬取,具體程式碼如下 : spider.py # -*- coding: utf-8 -*- import scrapy from scrapy import Request from jdpro.items

MongoDB資料庫基本語法練習——查詢

MongoDB資料庫基本語法練習——查詢篇 MongoDB是一個介於關係型資料庫和菲關係型資料庫之間的產品,其最大的特點是它支援的查詢語言非常強大,且其語法有點類似面向物件的查詢語言幾乎可以實現類似關係型資料庫單表查詢的絕大部分功能。 下面是我本人練習MongoDB資料庫基本語法(

Java操作MongoDB資料庫方法詳解

Java與 mongodb 的連線 連單臺mongodb Mongo mg = new Mongo();//預設連本機127.0.0.1 埠為27017 Mongo mg = new Mongo(ip);//可以指定ip 埠預設為27017 Mongo

Python3.x中使用MongoDB資料庫的簡單方法-------PyCharm

為了能夠PyCharm中使用MongoDB,需要先引入MongoDB第三方庫,具體的引入方法如下: 第一:先配置MongoDB外掛 1 開啟PyCharm,單擊  左上角“file”→“settings” ,如下圖     2  Plugins