四时宝库

程序员的知识宝库

MongoDB的学习,操作命令详细介绍(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(
   <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后面的;

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

可以看出_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的其他知识。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接