mongo shell

mongo shell是MongoDB的交互式JavaScript接口。 您可以使用mongo shell查询和更新数据以及执行管理操作。
mongo shell作为MongoDB Server安装的一部分包含在内。 MongoDB还提供mongo shell作为独立软件包。

现在我们开始使用吧,进入mongodb的安装目录的bin目录,当然你也可以设置mongodb的环境变量。

./mongo ip地址:port



mongodb 字符串转double求和 mongodb 数组转字符串_字段


创建数据库


mongodb 字符串转double求和 mongodb 数组转字符串_mongodb 输出数组字段_02


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({}):将一个或多个文档插入到集合中。


mongodb 字符串转double求和 mongodb 数组转字符串_字段_03


db.collection.insertOne({}):将单个文档插入集合中,3.2版本新功能。


mongodb 字符串转double求和 mongodb 数组转字符串_字段_04


如果文档未指定_id字段,则MongoDB将具有ObjectId值的_id字段添加到新文档中。

db.collection.insertMany({}):将多个文档插入一个集合中,3.2版本新功能。


mongodb 字符串转double求和 mongodb 数组转字符串_mongodb 输出数组字段_05


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.

这里插入官方提供的一个例子,这里只截取一部分。


mongodb 字符串转double求和 mongodb 数组转字符串_ios_06


mongodb 字符串转double求和 mongodb 数组转字符串_mongodb 输出数组字段_07


db.bios.find({_id:5}):返回_id等于5的bios集合中的文档


mongodb 字符串转double求和 mongodb 数组转字符串_ios_08


返回的数据格式较乱,可读性较差,可以在语句后面加入pretty()


mongodb 字符串转double求和 mongodb 数组转字符串_数组_09


db.bios.find( { "name.last": "Hopper" } ):访问嵌入式文档中last字段值为“Hopper”的文档。


mongodb 字符串转double求和 mongodb 数组转字符串_数组_10


db.bios.find({ _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } }):查询_id包含5, ObjectId("507c35dd8fada716c89d0013")的文档。


mongodb 字符串转double求和 mongodb 数组转字符串_mongodb删除字段_11


db.bios.find( { birth: { $gt: new Date('1950-01-01') } } ):查询birth字段,大于1950-01-01的文档


mongodb 字符串转double求和 mongodb 数组转字符串_ios_12


db.bios.find({ "name.last": { $regex: /^N/ } }):查询集合中name.last字段以字母N开头的文档,如sql中的"like N%"。


mongodb 字符串转double求和 mongodb 数组转字符串_数组_13


db.bios.find( { birth: { $gt: new Date('1940-01-01'), $lt: new Date('1960-01-01') } } ):查询birth在这两个时间之间的文档。


mongodb 字符串转double求和 mongodb 数组转字符串_字段_14


db.bios.find( {birth: { $gt: new Date('1920-01-01') },death: { $exists: false }} ):查询birth字段大于

1920-01-01,而且death不存在的集合。


mongodb 字符串转double求和 mongodb 数组转字符串_数组_15


还有很多的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来控制。


mongodb 字符串转double求和 mongodb 数组转字符串_ios_16


mongodb 字符串转double求和 mongodb 数组转字符串_数组_17


#结合查询参数和投影参数,返回contribs数组中包含db.bios.find(OOP   { contribs: 'OOP' },   { 'name.first': 0, birth: 0 })


mongodb 字符串转double求和 mongodb 数组转字符串_mongodb删除字段_18


#_id不显示,只显示name.last和contribs#且数组contribs前两个元素db.bios.find(   { },   {     _id: 0,     'name.last': 1,     contribs: { $slice: 2 }   })


mongodb 字符串转double求和 mongodb 数组转字符串_mongodb删除字段_19


其他查询方法:

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);}


mongodb 字符串转double求和 mongodb 数组转字符串_ios_20


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);}


mongodb 字符串转double求和 mongodb 数组转字符串_mongodb删除字段_21


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后面的;

updateupdate的对象和一些更新的操作符(如$,$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 }     }   })


mongodb 字符串转double求和 mongodb 数组转字符串_字段_22


可以看出_id=1的数据已经更新


mongodb 字符串转double求和 mongodb 数组转字符串_mongodb删除字段_23


对应的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)


mongodb 字符串转double求和 mongodb 数组转字符串_ios_24


集和插入一个新的文档:


mongodb 字符串转double求和 mongodb 数组转字符串_mongodb删除字段_25


注意:

如果所有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);}


mongodb 字符串转double求和 mongodb 数组转字符串_mongodb删除字段_26


db.collection.updateMany():更新与集合的指定过滤器匹配的所有文档。

try {   db.members.updateMany(      { points: { $gt: 10 } },      { $set: { "Review" : true } }   );} catch (e) {   print(e);}


mongodb 字符串转double求和 mongodb 数组转字符串_ios_27


在这里介绍mongodb的增删改查的常用的方法。还有很多的方法。可以在官网了解。

地址:https://docs.mongodb.com/manual/reference/method/js-collection/