golang mongodb or条件_MongoDB的学习,操作命令详细介绍
mongo shell
mongo shell是MongoDB的交互式JavaScript接口。 您可以使用mongo shell查詢和更新數據以及執行管理操作。
mongo shell作為MongoDB Server安裝的一部分包含在內。 MongoDB還提供mongo shell作為獨立軟件包。
現在我們開始使用吧,進入mongodb的安裝目錄的bin目錄,當然你也可以設置mongodb的環境變量。
./mongo ip地址:port創建數據庫
show dbs:顯示數據庫列表
use dbName:創建數據庫,插入數據才能創建數據庫成功。
show collections:db下面創建的集合列表
db.stats() :顯示數據庫信息
db.help(),db.collection.help():內置幫助,顯示各種方法的說明;
db.collection.find().size():獲取查詢集合中文檔的數量;
db.collection.drop():從數據庫中刪除指定的集合。
db.collection.count():集合中的文檔計數
CURD操作
insert操作:
db.collection.insert({}):將一個或多個文檔插入到集合中。
db.collection.insertOne({}):將單個文檔插入集合中,3.2版本新功能。
如果文檔未指定_id字段,則MongoDB將具有ObjectId值的_id字段添加到新文檔中。
db.collection.insertMany({}):將多個文檔插入一個集合中,3.2版本新功能。
find操作:
db.collection.find(query, projection)
query:可選,使用查詢操作符指定查詢條件
projection:可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值,只需省略該參數即可(默認省略)。
首先來介紹MongoDB提供的查詢操作符:
比較:
$eq:匹配等于指定的值
$gt:匹配大于指定的值
$gte:匹配大于或等于指定的值
$in:匹配數組中指定的任何值。
$lt:匹配小于指定的值。
$lte:匹配小于或等于指定的值
$ne:匹配所有不等于指定的值。
$nin:不匹配數組中指定的任何值。
邏輯:
$and:用AND連接查詢子句,返回與兩個子句的條件都匹配的所有文檔。
$not:返回與查詢表達式不匹配的文檔。
$nor:將查詢子句與nor連接,返回所有未能匹配這兩個子句的文檔。
$or:用or連接查詢子句,返回與任一子句條件匹配的所有文檔。
元素:
$exists:匹配具有指定字段的文檔。
$type:如果字段是指定類型,則選擇文檔
估值:
$expr:允許在查詢語言中使用聚合表達式。
$mod:對字段的值執行模運算,并選擇具有指定結果的文檔。
$text:執行文本搜索。
$regex:選擇值與指定的正則表達式匹配的文檔。
還有其他的類型的比如:按照空間地理的,數組,字節,注釋等,不做介紹了,在這里指出了比較常用的。
Projection操作符:
$:在與查詢條件匹配的數組中投影第一個元素。
$elemMatch:投影與指定的$elemMatch條件匹配的數組中的第一個元素。
$meta:投影$text操作期間分配的文檔分數。
$slice:限制從數組投影的元素數量。 支持skip和limit slices.
這里插入官方提供的一個例子,這里只截取一部分。
db.bios.find({_id:5}):返回_id等于5的bios集合中的文檔
返回的數據格式較亂,可讀性較差,可以在語句后面加入pretty()
db.bios.find( { "name.last": "Hopper" } ):訪問嵌入式文檔中last字段值為“Hopper”的文檔。
db.bios.find({ _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } }):查詢_id包含5, ObjectId("507c35dd8fada716c89d0013")的文檔。
db.bios.find( { birth: { $gt: new Date('1950-01-01') } } ):查詢birth字段,大于1950-01-01的文檔
db.bios.find({ "name.last": { $regex: /^N/ } }):查詢集合中name.last字段以字母N開頭的文檔,如sql中的"like N%"。
db.bios.find( { birth: { $gt: new Date('1940-01-01'), $lt: new Date('1960-01-01') } } ):查詢birth在這兩個時間之間的文檔。
db.bios.find( {birth: { $gt: new Date('1920-01-01') },death: { $exists: false }} ):查詢birth字段大于
1920-01-01,而且death不存在的集合。
還有很多的find查詢的方法,我就不截圖了。在這里簡單的列出下。
#查詢集合中,name字段#符合 first: "Yukihiro", last: "Matsumoto"的文檔db.bios.find( { name: { first: "Yukihiro", last: "Matsumoto" } })#名稱字段必須與嵌入文檔完全匹配,以下都不匹配{ first: "Yukihiro", aka: "Matz", last: "Matsumoto"}{ last: "Matsumoto", first: "Yukihiro"}#也可以使用這種方式db.bios.find( { "name.first": "Yukihiro", "name.last": "Matsumoto" })有關數據元素的操作:
#contribs數據中的UNIX元素db.bios.find( { contribs: "UNIX" } )##數組元素中包含db.bios.find( { contribs: { $in: [ "ALGOL", "Lisp" ]} } )#數組元素中同時包含db.bios.find( { contribs: { $all: [ "ALGOL", "Lisp" ] } } )#數組的大小db.bios.find( { contribs: { $size: 4 } } )接下來看看有投影操參數,projection參數指定要返回的字段。
使用投影參數需要注意一點。該參數包含:包含或排除規范,但不能同時包含兩者,除非排除是針對_id字段的。
db.bios.find( { }, { name: 1, contribs: 1 } ):只返回name,contribs兩個字段,其他的字段不需要顯示,
_id字段是默認顯示的,除非投影文檔_id:0中明確排除_id字段。用0,1來控制。
#結合查詢參數和投影參數,返回contribs數組中包含db.bios.find(OOP { contribs: 'OOP' }, { 'name.first': 0, birth: 0 })#_id不顯示,只顯示name.last和contribs#且數組contribs前兩個元素db.bios.find( { }, { _id: 0, 'name.last': 1, contribs: { $slice: 2 } })其他查詢方法:
db.bios.find().limit( 5 ):查詢前5條
db.bios.find().skip( 5 ):跳過前5條,返回剩下所有
db.bios.find().sort( { name: 1 } ):按照name字段排序,1:升序,-1:降序
db.bios.find().sort( { name: 1 } ).limit( 5 )
db.bios.find().limit( 5 ).sort( { name: 1 } )
delete操作
db.collection.deleteOne( , { writeConcern: , collation: })filter:使用查詢運算符指定刪除條件。指定一個空文檔{}刪除集合中返回的第一個文檔。
writeConcern:可選的,忽略使用默認的writeConcern。
collation:collation是指允許MongoDB的用戶根據不同的語言定制排序規則。
如果未指定collation規則,但是集合具有默認collation規則。常用的配置如下:
collation: { locale: , caseLevel: , caseFirst: , strength: , numericOrdering: , alternate: , maxVariable: , backwards: }db.orders.deleteOne:刪除與過濾器匹配的第一個文檔。
try { db.orders.deleteOne( { "_id" : ObjectId("563237a41a4d68582c2509da") } );} catch (e) { print(e);}try { db.orders.deleteOne( { "_id" : ObjectId("563237a41a4d68582c2509da") }, { w : "majority", wtimeout : 100 } );} catch (e) { print (e);}如果花費的時間超過了wtimeout限制,則會引發以下異常:
WriteConcernError({ "code" : 64, "errInfo" : { "wtimeout" : true }, "errmsg" : "waiting for replication timed out"})db.collection.deleteMany():從集合中刪除所有與過濾器匹配的文檔。
插入測試數據:
{ _id: ObjectId("563237a41a4d68582c2509da"), stock: "Brent Crude Futures", qty: 250, type: "buy-limit", limit: 48.90, creationts: ISODate("2015-11-01T12:30:15Z"), expiryts: ISODate("2015-11-01T12:35:15Z"), client: "Crude Traders Inc."}try { db.orders.deleteMany( { "client" : "Crude Traders Inc." } );} catch (e) { print (e);}try { db.orders.deleteMany( { "stock" : "Brent Crude Futures", "limit" : { $gt : 48.88 } } );} catch (e) { print (e);}update操作
db.collection.update(query, update, options)
db.collection.update( , , { upsert: , multi: , writeConcern: , collation: , arrayFilters: [ , ... ], hint: // Available starting in MongoDB 4.2 })query:update的查詢條件,類似sql update查詢內where后面的;
update:update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set后面的。
upsert:可選,這個參數的意思是,如果不存在update的記錄,是否插入新文檔,true為插入,默認是false,不插入。
multi:可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。
writeConcern::可選,寫安全配置。
collation:可選,collation是指允許MongoDB的用戶根據不同的語言定制排序規則。
arrayFilters:可選,篩選文檔的數組,用于確定針對數組字段的更新操作要修改哪些數組元素。
hint:一個文檔或字符串,它指定用于支持查詢的索引。4.2的新功能。
先介紹更新操作符:
$inc:指定值加n
$set:更新指定字段
$unset:將指定字段刪除
$rename:更新字段名稱
$:定位到某一個元素
$push:添加值到數組中
$addToSet: 添加值到數組中,有重復則不處理
$pop:刪除數組第一個或者最后一個
$pull:從數組中刪除匹配查詢條件的值
$pullAll:從數組中刪除多個值 數組運算修飾符
$each:與$push和$addToSet一起使用來操作多個值
$slice:與$push和$each一起使用來操作用來縮小更新后 數組的大小
$sort:與$push、$each和$slice一起使用來對數組進行排 序
$isolated:隔離其他操作,不允許其他操作交叉更新,不能在分片中使用
插入測試數據:
db.books.remove({});db.books.insertMany([ { "_id" : 1, "item" : "TBD", "stock" : 0, "info" : { "publisher" : "1111", "pages" : 430 }, "tags" : [ "technology", "computer" ], "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "lmn", "rating" : 5 } ], "reorder" : false }, { "_id" : 2, "item" : "XYZ123", "stock" : 15, "info" : { "publisher" : "5555", "pages" : 150 }, "tags" : [ ], "ratings" : [ { "by" : "xyz", "rating" : 5 } ], "reorder" : false }]);db.books.update( { _id: 1 }, { $inc: { stock: 5 }, $set: { item: "ABC123", "info.publisher": "2222", tags: [ "software" ], "ratings.1": { by: "xyz", rating: 3 } } })可以看出_id=1的數據已經更新
對應的SQL語句:
UPDATE booksSET stock = stock + 5 item = "ABC123" publisher = 2222 pages = 430 tags = "software" rating_authors = "ijk,xyz" rating_values = "4,3"WHERE _id = 1upsert例子:
db.books.update( { item: "ZZZ135" }, // Query parameter { // Replacement document item: "ZZZ135", stock: 5, tags: [ "database" ] }, { upsert: true } // Options)集和插入一個新的文檔:
注意:
如果所有db.collection.update()操作在任何客戶端成功插入數據之前完成了查詢部分,并且name字段上沒有唯一索引,則每個更新操作都可能導致插入。
為防止MongoDB多次插入同一文檔,請在名稱字段上創建唯一索引。 使用唯一索引,如果多個應用程序使用upsert:true發出相同的更新,則只有一個db.collection.update()將成功插入一個新文檔。
插入測試數據:
db.members.insertMany([ { "_id" : 1, "member" : "abc123", "status" : "A", "points" : 2, "misc1" : "note to self: confirm status", "misc2" : "Need to activate", "lastUpdate" : ISODate("2019-01-01T00:00:00Z") }, { "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment", "lastUpdate" : ISODate("2019-01-01T00:00:00Z") }])db.members.update( { }, [ { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ], lastUpdate: "$$NOW" } }, { $unset: [ "misc1", "misc2" ] } ], { multi: true })第一階段, $ set階段:
創建一個comments字段,其元素是misc1和misc2字段的當前內容,并且 將字段lastUpdate設置為NOW的值。 聚合變量NOW解析為當前日期時間值。
第二階段 $unset階段刪除misc1和misc2字段。
更新后的數據:
db.collection.updateOne()根據過濾器更新集合中的單個文檔。
db.collection.updateMany():更新與集合的指定過濾器匹配的所有文檔。
try { db.members.updateMany( { points: { $gt: 10 } }, { $set: { "Review" : true } } );} catch (e) { print(e);}在這里介紹mongodb的增刪改查的常用的方法。還有很多的方法。可以在官網了解。
地址:https://docs.mongodb.com/manual/reference/method/js-collection/
喜歡的話,可以關注我,后續繼續介紹mongodb的其他知識。
總結
以上是生活随笔為你收集整理的golang mongodb or条件_MongoDB的学习,操作命令详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5获取http请求头_获取托管者发送ht
- 下一篇: 原字体_时隔25天,再次更新字体,ios