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(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
filter:使用查询运算符指定删除条件。指定一个空文档{}删除集合中返回的第一个文档。
writeConcern:可选的,忽略使用默认的writeConcern。
collation:collation是指允许MongoDB的用户根据不同的语言定制排序规则。
如果未指定collation规则,但是集合具有默认collation规则。常用的配置如下:
collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
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(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // 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 books
SET 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/
喜欢的话,可以关注我,后续继续介绍mongodb的其他知识。