一,資料庫操作
1,Create Database
語法:
use <database name>
- 無則創建,有則使用,
示例:
> use mydb
switched to db mydb
確認資料庫是否存在:
> db
mydb
這表明正在使用mydb資料庫,
2, Drop Database
語法:db.dropDatabase()
- 要洗掉資料庫,請首先確保正在使用該資料庫,
示例:
> use mydb
switched to db mydb
>
> db.dropDatabase()
{ "ok" : 1 }
3,Display List of Databases
語法:show dbs或show databases;
- show databases;用到了mongodb中為數不多的’;‘這個符號,
示例:
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
>
> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
>
- 新創建的資料庫mydb未顯示在串列中,這是因為資料庫需要至少一個集合來顯示在串列中,
4, Display the Version of MongoDB
語法:db.version()
示例:
> db.version()
4.2.8
5,Display a List of Commands
語法:db.help()
示例:
> db.help()
DB methods:
db.adminCommand(nameOrDocument) - switches to 'admin' db, and runs command [just calls db.runCommand(...)]
db.aggregate([pipeline], {options}) - performs a collectionless aggregation on this database; returns a cursor
db.auth(username, password)
db.cloneDatabase(fromhost) - will only function with MongoDB 4.0 and below
db.commandHelp(name) returns the help for the command
db.copyDatabase(fromdb, todb, fromhost) - will only function with MongoDB 4.0 and below
db.createCollection(name, {size: ..., capped: ..., max: ...})
db.createUser(userDocument)
db.createView(name, viewOn, [{$operator: {...}}, ...], {viewOptions})
db.currentOp() displays currently executing operations in the db
db.dropDatabase(writeConcern)
db.dropUser(username)
db.eval() - deprecated
db.fsyncLock() flush data to disk and lock server for backups
db.fsyncUnlock() unlocks server following a db.fsyncLock()
db.getCollection(cname) same as db['cname'] or db.cname
db.getCollectionInfos([filter]) - returns a list that contains the names and options of the db's collections
db.getCollectionNames()
db.getLastError() - just returns the err msg string
db.getLastErrorObj() - return full status object
db.getLogComponents()
db.getMongo() get the server connection object
db.getMongo().setSlaveOk() allow queries on a replication slave server
db.getName()
db.getProfilingLevel() - deprecated
db.getProfilingStatus() - returns if profiling is on and slow threshold
db.getReplicationInfo()
db.getSiblingDB(name) get the db at the same server as this one
db.getWriteConcern() - returns the write concern used for any operations on this db, inherited from server object if set
db.hostInfo() get details about the server's host
db.isMaster() check replica primary status
db.killOp(opid) kills the current operation in the db
db.listCommands() lists all the db commands
db.loadServerScripts() loads all the scripts in db.system.js
db.logout()
db.printCollectionStats()
db.printReplicationInfo()
db.printShardingStatus()
db.printSlaveReplicationInfo()
db.resetError()
db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into {cmdObj: 1}
db.serverStatus()
db.setLogLevel(level,<component>)
db.setProfilingLevel(level,slowms) 0=off 1=slow 2=all
db.setVerboseShell(flag) display extra information in shell output
db.setWriteConcern(<write concern doc>) - sets the write concern for writes to the db
db.shutdownServer()
db.stats()
db.unsetWriteConcern(<write concern doc>) - unsets the write concern for writes to the db
db.version() current version of the server
db.watch() - opens a change stream cursor for a database to report on all changes to its non-system collections.
二,MongoDB CRUD Operations
不止CRUD,還討論了 embedded document and arrays,
Collections
MongoDB集合類似于RDBMS中的資料表, 在MongoDB中,當我們在一個集合中參考它們時,它們會自動創建:
db.person.insert({_id:100001,name:"Taanushree A S",age:10})
- 如果不存在,此命令將創建一個名為person的集合,如果存在,則僅將檔案插入集合,
1. Create a Collection
語法:db.createCollection (<name>)
示例:
db.createCollection("person")
{ "ok" : 1 }
確認集合的存在:
> show collections
person
2. Create Capped Collections
capped collections,就是固定大小的collections,支持基于插入順序插入和檢索檔案的高吞吐量操作,作業方式類似于回圈緩沖區:一旦集合填滿了它所分配的空間,它就會覆寫集合中最老的檔案,從而為新檔案騰出空間,
這種特性決定了它的一些使用場景:
- 存盤由大容量系統生成的日志資訊,在沒有索引的Capped Collections中插入檔案的速度接近于將日志資訊直接寫入檔案系統的速度,此外,內置的先入先出屬性在管理存盤使用時維護事件的順序,
- 在一個Capped Collections中快取少量資料, 由于讀取快取而不是寫入大量快取,因此需要確保此集合始終保留在作業集中(即在RAM中),
Capped Collections的一些限制:
- 無法對Capped Collections進行分片,
- 不能使用聚合管道運算子
$out來將結果寫入Capped Collections, - 無法從Capped Collections中洗掉檔案,
- 創建索引可高效執行更新操作,
語法:db.createCollection (<name>,{capped:<boolean>,size:<number>,max :<number>})
- 如果size欄位小于或等于4096,則集合的大小為size位元組,否則,MongoDB將提高所提供的大小,使其成為256的整數倍,
- max表示允許的最大檔案數,
例子:
> db.createCollection("student",{capped: true,size:1000,max:2})
{ "ok" : 1 }
> db.student.isCapped()
true
可繼續插入資料進行特征測驗,此處我略了,
Create Operations
Create Operations可以將檔案插入到集合中, 這些插入操作針對單個集合, 在單個檔案級別,所有寫操作都是原子的,

Insert Documents
語法:db.collection.insertOne() 或db.collection.insertMany() 或db.collection.insert()
示例:Insert a Single Document
> db.person.insertOne({_id:1001,name:"Taanushree AS",age:10})
{ "acknowledged" : true, "insertedId" : 1001 }
- insertOne()回傳包含新插入的檔案的檔案
_id,如果未指定_id欄位,則MongoDB會生成一個_id欄位,其中包含一個ObjectId值, _id欄位充當主鍵,
> db.person.insertOne({name:"Aruna MS",age:14})
{
"acknowledged" : true,
"insertedId" : ObjectId("5f64da530dc4211a1b87073c")
}
示例:Insert Multiple Documents
> db.person.insertMany([{_id:1003,name:"Anba V M",age:16},{_id:
... 1004,name:"shobana",age:44}])
{ "acknowledged" : true, "insertedIds" : [ 1003, 1004 ] }
db.collection.insert()單條多條都能插入,用的比較多,
Read Operations
MongoDB提供了find()方法來查詢檔案,
Query Documents
語法:db.collection.find()
- pretty()讓結果更美觀,
示例:Select All Documents in a collection
> db.person.find({})
{ "_id" : 1001, "name" : "Taanushree AS", "age" : 10 }
{ "_id" : ObjectId("5f64db2a0dc4211a1b87073d"), "name" : "Aruna MS", "age" : 14 }
{ "_id" : 1003, "name" : "Anba V M", "age" : 16 }
{ "_id" : 1004, "name" : "shobana", "age" : 44 }
示例:Specify Equality Conditions
查詢中使用運算式<field>:<value>以過濾檔案,
> db.person.find({name:"shobana"})
{ "_id" : 1004, "name" : "shobana", "age" : 44 }
示例:Specify Conditions Using Query Operator
Query Selectors,
> db.person.find({age:{$gt:10}})
{ "_id" : ObjectId("5bac86dc773204ddade95819"), "name" : "Aruna
MS", "age" : 14 }
{ "_id" : 1003, "name" : "Anba V M", "age" : 16 }
{ "_id" : 1004, "name" : "shobana", "age" : 44 }
示例:Specify AND Conditions
<field1>:<value1>,<field2>:<value2>
db.person.find({ name:"shobana",age:{$gt:10}})
{ "_id" : 1004, "name" : "shobana", "age" : 44 }
示例:Specify OR Conditions
運算子$or從集合中選擇至少匹配一種條件的檔案,
db.person.find( { $or: [ { name: "shobana" }, { age: { $eq:
20 } } ] } )
{ "_id" : 1004, "name" : "shobana", "age" : 44 }
Update Operations

在MongoDB中,更新操作針對單個集合,
MongoDB提供了修改運算子來修改欄位值,
{
<update operator>: { <field1>: <value1>, ... },
<update operator>: { <field2>: <value2>, ... },
...
}
Update Operators,
Update Documents
示例:Update a Single Document
> db.student.updateOne({name: "Joshi"},{$set:{"marks.english": 20}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
- _id是無法更新的,
- 這里涉及到嵌套查詢
field.subfield“marks.english”,后面會講,
示例:Update Multiple Documents
> db.student.updateMany( { "result":"fail" }, { $set: {"marks.
english": 20, "marks.maths": 20 }})
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
示例:Replace a Document
通過將一個全新的檔案作為第二個引數傳遞給db.collection.replaceOne(),可以替換_id欄位以外的檔案的全部內容,
> db.student.replaceOne( { name: "John" }, {_id:1001,name:"John
",marks:{english:36,maths:39},result:"pass"})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" :
1 }
- 檔案替換中不要包括更新運算子,
- 替換時可省略_id欄位,因為_id欄位是不可變的, 但是,如果要包括_id欄位,請使用與當前值相同的值,
Delete Operations

在MongoDB中,洗掉操作針對單個集合,
Delete Documents
示例:Delete Only One Document That Matches a Condition
> db.student.deleteOne({name: "John"})
{ "acknowledged" : true, "deletedCount" : 1 }
示例:Delete All Documents That Match a Condition
> db.student.deleteMany({name: "Jack"})
{ "acknowledged" : true, "deletedCount" : 2 }
示例:Delete All Documents from a Collection
> db.student.deleteMany({})
{ "acknowledged" : true, "deletedCount" : 3 }
三,MongoDB Import and Export
MongoDB Import
MongoDB匯入工具允許我們從JSON、CSV和TSV檔案匯入內容,但MongoDB匯入僅支持UTF-8編碼的檔案,
準備一個csv檔案:
c:\Sample\student.csv
_id,name,class
1,John,II
2,James,III
3,Joshi,I
匯入:
> mongoimport --db student --collection students --type csv
--headerline --file c:\Sample\student.csv
MongoDB Export
要使用Mongo export命令,請啟動mongod行程并打開另一個命令提示符以發出Mongo匯出命令,
匯出:
> mongoexport --db student --collection students --out C:\Sample\student.json
四,MongoDB中的嵌入式檔案
用嵌入式檔案可以讓我們將檔案嵌入另一個檔案:
{_id:1001,name:"John",marks:{english:35,maths:38},result:"pass"}
示例:
> use employee
switched to db employee
> db.employee.insertMany([
... {_id:1001,name:"John",address:{previous:"123,1st Main",current:"234,2nd Main"},unit:"Hadoop"},
... {_id:1002,name:"Jack", address:{previous:"Cresent Street",current:"234,Bald Hill Street"},unit:"MongoDB"},
... {_id:1003,name:"James", address:{previous:"Cresent Street",current:"234,Hill Street"},unit:"Spark"}
... ])
2020-09-19T01:48:53.885+0800 E QUERY [js] uncaught exception: BulkWriteError({
"writeErrors" : [
{
"index" : 0,
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: employee.employee index: _id_ dup key: { _id: 1001.0 }",
"op" : {
"_id" : 1001,
"name" : "John",
"address" : {
"previous" : "123,1st Main",
"current" : "234,2nd Main"
},
"unit" : "Hadoop"
}
}
],
"writeConcernErrors" : [ ],
"nInserted" : 0,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
}) :
BulkWriteError({
"writeErrors" : [
{
"index" : 0,
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: employee.employee index: _id_ dup key: { _id: 1001.0 }",
"op" : {
"_id" : 1001,
"name" : "John",
"address" : {
"previous" : "123,1st Main",
"current" : "234,2nd Main"
},
"unit" : "Hadoop"
}
}
],
"writeConcernErrors" : [ ],
"nInserted" : 0,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
BulkWriteError@src/mongo/shell/bulk_api.js:367:48
BulkWriteResult/this.toError@src/mongo/shell/bulk_api.js:332:24
Bulk/this.execute@src/mongo/shell/bulk_api.js:1186:23
DBCollection.prototype.insertMany@src/mongo/shell/crud_api.js:326:5
@(shell):1:1
> db.employee.find().pretty()
{
"_id" : 1001,
"name" : "John",
"address" : {
"previous" : "123,1st Main",
"current" : "234,2nd Main"
},
"unit" : "Hadoop"
}
{
"_id" : 1002,
"name" : "Jack",
"address" : {
"previous" : "Cresent Street",
"current" : "234,Bald Hill Street"
},
"unit" : "MongoDB"
}
{
"_id" : 1003,
"name" : "James",
"address" : {
"previous" : "Cresent Street",
"current" : "234,Hill Street"
},
"unit" : "Spark"
}
Query Embedded Documents
示例: Match an Embedded or Nested Document
> db.employee.find( { address: { previous:"Cresent Street",current:"234,Bald Hill Street" }} )
{ "_id" : 1002, "name" : "Jack", "address" : { "previous" : "Cresent Street", "current" : "234,Bald Hill Street" }, "unit" : "MongoDB" }
示例:Query on a Nested Field 查詢嵌套的檔案內容
過濾器語法:<field.subfield>:<value>
> db.employee.find( { "address.previous": "Cresent Street" } )
{ "_id" : 1002, "name" : "Jack", "address" : { "previous" : "Cresent Street", "current" : "234,Bald Hill Street" }, "unit" : "MongoDB" }
{ "_id" : 1003, "name" : "James", "address" : { "previous" : "Cresent Street", "current" : "234,Hill Street" }, "unit" : "Spark" }
Working with Arrays
插入帶有陣列的資料:
> db.employeedetails.insertMany([
... { name: "John", projects: ["MongoDB", "Hadoop","Spark"],scores:[25,28,29] },
... { name: "James", projects: ["Cassandra","Spark"], scores:[26,24,23]},
... { name: "Smith",projects: [ "Hadoop","MongoDB"], scores:[22,28,26]}
... ])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5f64f61b713e47e2bf78851f"),
ObjectId("5f64f61b713e47e2bf788520"),
ObjectId("5f64f61b713e47e2bf788521")
]
}
查詢所有projects中包含[“Hadoop”, “MongoDB”]這種內容與內容順序的檔案:
> db.employeedetails.find( { projects: ["Hadoop", "MongoDB"] } )
{ "_id" : ObjectId("5f64f61b713e47e2bf788521"), "name" : "Smith", "projects" : [ "Hadoop", "MongoDB" ], "scores" : [ 22, 28, 26 ] }
示例:Query an Array for an Element
> db.employeedetails.find( { projects: "MongoDB" } )
{ "_id" : ObjectId("5badcbd5f10ab299920f0728"), "name" :
"John", "projects" : [ "MongoDB", "Hadoop", "Spark" ], "scores"
: [ 25, 28, 29 ] }
{ "_id" : ObjectId("5badcbd5f10ab299920f072a"), "name" : "Smith",
"projects" : [ "Hadoop", "MongoDB" ], "scores" : [ 22, 28, 26 ] }
示例:Specify Query Operators
> db.employeedetails.find( { scores:{$gt:26} } )
{ "_id" : ObjectId("5badcbd5f10ab299920f0728"), "name" :
"John", "projects" : [ "MongoDB", "Hadoop", "Spark" ], "scores"
: [ 25, 28, 29 ] }
{ "_id" : ObjectId("5badcbd5f10ab299920f072a"), "name" : "Smith",
"projects" : [ "Hadoop", "MongoDB" ], "scores" : [ 22, 28, 26 ] }
示例:Query an Array with Compound Filter Conditions on the Array Elements
> db.employeedetails.find( { scores: { $gt: 20, $lt: 24 } } )
{ "_id" : ObjectId("5badcbd5f10ab299920f0729"), "name" :
"James", "projects" : [ "Cassandra", "Spark" ], "scores" :
[ 26, 24, 23 ] }
{ "_id" : ObjectId("5badcbd5f10ab299920f072a"), "name" :
"Smith", "projects" : [ "Hadoop", "MongoDB" ], "scores" :
[ 22, 28, 26 ] }
示例:Using the $elemMatch operator
$elemMatch運算子將查詢結果中的<array>欄位的內容限制為只包含與$elemMatch條件匹配的第一個元素,
> db.employeedetails.find({scores: {$elemMatch: { $gt: 23, $lt: 27}} } )
{ "_id" : ObjectId("5f64f61b713e47e2bf78851f"), "name" : "John", "projects" : [ "MongoDB", "Hadoop", "Spark" ], "scores" : [ 25, 28, 29 ] }
{ "_id" : ObjectId("5f64f61b713e47e2bf788520"), "name" : "James", "projects" : [ "Cassandra", "Spark" ], "scores" : [ 26, 24, 23 ] }
{ "_id" : ObjectId("5f64f61b713e47e2bf788521"), "name" : "Smith", "projects" : [ "Hadoop", "MongoDB" ], "scores" : [ 22, 28, 26 ] }
示例:Query an Array Element by Index Position
> db.employeedetails.find( { "scores.2": { $gt: 26 } } )
{ "_id" : ObjectId("5badcbd5f10ab299920f0728"), "name" :
"John", "projects" : [ "MongoDB", "Hadoop", "Spark" ], "scores"
: [ 25, 28, 29 ] }
- 陣列下標從0開始,
示例:Using the $size Operator
$size選擇指定陣列大小的檔案,
> db.employeedetails.find( { "projects": { $size: 2 } } )
{ "_id" : ObjectId("5badcbd5f10ab299920f0729"), "name" :
"James", "projects" : [ "Cassandra", "Spark" ], "scores" : [
26, 24, 23 ] }
{ "_id" : ObjectId("5badcbd5f10ab299920f072a"), "name" :
"Smith", "projects" : [ "Hadoop", "MongoDB" ], "scores" : [ 22,
28, 26 ] }
示例:Using the p u s h O p e r a t o r ‘ push Operator ` pushOperator‘push`添加資料到陣列,
> db.employeedetails.update({name:"James"},{$push:{Location: "US"}})
> db.employeedetails.find({name:"James"})
{ "_id" : ObjectId("5c04bef3540e90478dd92f4e"), "name" :
"James", "projects" : [ "Cassandra", "Spark" ], "scores" :
[ 26, 24, 23 ], "Location" : [ "US" ] }
- 也可以像陣列中添加多個數值,
> db.employeedetails.update({name: "Smith"},{$push:{Location:{$each:["US","UK"]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.employeedetails.find().pretty()
{
"_id" : ObjectId("5f64f61b713e47e2bf78851f"),
"name" : "John",
"projects" : [
"MongoDB",
"Hadoop",
"Spark"
],
"scores" : [
25,
28,
29
]
}
{
"_id" : ObjectId("5f64f61b713e47e2bf788520"),
"name" : "James",
"projects" : [
"Cassandra",
"Spark"
],
"scores" : [
26,
24,
23
],
"Location" : [
"US"
]
}
{
"_id" : ObjectId("5f64f61b713e47e2bf788521"),
"name" : "Smith",
"projects" : [
"Hadoop",
"MongoDB"
],
"scores" : [
22,
28,
26
],
"Location" : [
"US",
"UK"
]
}
示例:Using the $addToSet Operator
$addToSet只在集合中不存在的情況下向陣列中添加元素,
> db.employeedetails.update( {name: "James"}, { $addToSet: {hobbies: [ "drawing", "dancing"]} })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
示例:Using the $pop Operator
> db.employeedetails.find( {name: "James"}).pretty()
{
"_id" : ObjectId("5f64f61b713e47e2bf788520"),
"name" : "James",
"projects" : [
"Cassandra",
"Spark"
],
"scores" : [
26,
24,
23
],
"Location" : [
"US"
],
"hobbies" : [
[
"drawing",
"dancing"
]
]
}
移除scores陣列中的第一個元素:
> db.employeedetails.update( {name: "James"},{ $pop:{scores:-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.employeedetails.find( {name: "James"}).pretty()
{
"_id" : ObjectId("5f64f61b713e47e2bf788520"),
"name" : "James",
"projects" : [
"Cassandra",
"Spark"
],
"scores" : [
24,
23
],
"Location" : [
"US"
],
"hobbies" : [
[
"drawing",
"dancing"
]
]
}
移除scores陣列中的最后一個元素:
> db.employeedetails.update( {name: "James"},{ $pop: {scores:1}})
Query an Array of Embedded Documents
示例:Query for a Document Nested in an Array
準備資料:
> use student
switched to db student
> db.studentmarks.insertMany([
... {name:"John",marks:[
... {class: "II", total: 489},
... { class: "III", total: 490 }
... ]},
... {name:"James",marks:[
... {class: "III", total: 469 },
... {class: "IV",total: 450}
... ]},
... {name:"Jack",marks:[
... {class:"II", total: 489 },
... {class: "III", total: 390}
... ]},
... {name:"Smith", marks:[
... {class:"III", total: 489},
... {class: "IV", total: 490}
... ]},
... {name:"Joshi",marks:[
... {class: "II", total: 465},
... { class: "III",total: 470}
... ]}
... ])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5f64ffd1713e47e2bf788522"),
ObjectId("5f64ffd1713e47e2bf788523"),
ObjectId("5f64ffd1713e47e2bf788524"),
ObjectId("5f64ffd1713e47e2bf788525"),
ObjectId("5f64ffd1713e47e2bf788526")
]
}
> db.studentmarks.find( { "marks": {class: "II", total: 489}})
{ "_id" : ObjectId("5bae10e6f10ab299920f073f"), "name" :
"John", "marks" : [ { "class" : "II", "total" : 489 }, {
"class" : "III", "total" : 490 } ] }
{ "_id" : ObjectId("5bae10e6f10ab299920f0741"), "name" : "Jack",
"marks" : [ { "class" : "II", "total" : 489 }, { "class" :
"III", "total" : 390 } ] }
示例:Query for a Field Embedded in an Array of Documents
> db.studentmarks.find( { 'marks.total': { $lt: 400 } } )
{ "_id" : ObjectId("5bae10e6f10ab299920f0741"), "name" :
"Jack", "marks" : [ { "class" : "II", "total" : 489 }, {
"class" : "III", "total" : 390 } ] }
示例:Array Index to Query for a Field in the Embedded Document
> db.studentmarks.find( { 'marks.0.class': "II" } )
{ "_id" : ObjectId("5bae10e6f10ab299920f073f"), "name" :
"John", "marks" : [ { "class" : "II", "total" : 489 },
{ "class" : "III", "total" : 490 } ] }
{ "_id" : ObjectId("5bae10e6f10ab299920f0741"), "name" :
"Jack", "marks" : [ { "class" : "II", "total" : 489 },
{ "class" : "III", "total" : 390 } ] }
{ "_id" : ObjectId("5bae10e6f10ab299920f0743"), "name" :
"Joshi", "marks" : [ { "class" : "II", "total" : 465 },
{ "class" : "III", "total" : 470 } ] }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/100722.html
標籤:其他
