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 = 1
upsert例子:
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字段。
更新后的数据:
{ "_id" : 1, "member" : "abc123", "status" : "Modified", "points" : 2, "lastUpdate" : ISODate("2020-01-23T05:11:45.784Z"), "comments" : [ "note to self: confirm status", "Need to activate" ] }{ "_id" : 2, "member" : "xyz123", "status" : "Modified", "points" : 60, "lastUpdate" : ISODate("2020-01-23T05:11:45.784Z"), "comments" : [ "reminder: ping me at 100pts", "Some random comment" ] }
db.collection.updateOne()根据过滤器更新集合中的单个文档。
try { db.members.updateOne( { "member" : "abc123" }, { $set: { "status" : "updateOne" } } );} catch (e) { print(e);}
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/