MongoDB的使用入门

pymongo指令集

接上文:mongoDB初体验:mac平台 已经创建好的tutorial数据库

添加集合

接下来在该数据库里面添加一个电影集合

执行:db.createCollection('movie')
结果:{"ok":1}

插入数据

1、插入另一个对象数据

向该集合中插入数据
执行:

点击查看代码
db.movie.insert(
 {
   title: 'Forrest Gump', 
   directed_by: 'Robert Zemeckis',
   stars: ['Tom Hanks', 'Robin Wright', 'Gary Sinise'],
   tags: ['drama', 'romance'],
   debut: new Date("1994-07-06T00:00:00"),
   likes: 864367,
   dislikes: 30127,
   comments: [	
      {
         user:'user1',
         message: 'My first comment',
         dateCreated: new Date("2020-10-15T00:00:00"),
         like: 0 
      },
      {
         user:'user2',
         message: 'My first comment too!',
         dateCreated: new Date("2019-04-15T00:00:00"),
         like: 0 
      }
   ]
}
)

结果:说明插入成功
Inserted 1 document(s) in 14ms
WriteResult({
"nInserted": 1
})
ps:请注意,这里插入数据之前,并不需要我们先声明这部电影里面有哪些。我们直接插入就可以了~这一点和SQL不一样,SQL先声明一个表里面有哪些列,而MongoDB没有需要。

2、在原对象数据添加新的key

db.movie.updateOne({title:'Seven'},{$set:{grade:1}})

查询数据

执行db.movie.find().pretty()
结果:查询数据中的所有对象数据Fetched 1 document in 13ms :MongoDB为文档型数据,此处可以发现

这里find()里面是空的,说明我们不做限制和筛选,就像SQL没有WHERE语句一样。而pretty()输出经格式美化后自己的数据,你可以试试没有pretty()会怎么样。

仔细观察文档find()的结果,你会发现一个自动叫'_id'的东西,这是数据库创建的一个 ID 号,在同一个数据库中,每个 ID 号都是不同的。
我们也可以同时输入多个数据

点击查看代码
db.movie.insert([
 {
   title: 'Fight Club', 
   directed_by: 'David Fincher',
   stars: ['Brad Pitt', 'Edward Norton', 'Helena Bonham Carter'],
   tags: 'drama',
   debut: new Date("1999-10-15T00:00:00"),
   likes: 224360,
   dislikes: 40127,
   comments: [	
      {
         user:'user3',
         message: 'My first comment',
         dateCreated: new Date("2020-10-15T01:00:00"),
         like: 0 
      },
      {
         user:'user2',
         message: 'My first comment too!',
         dateCreated: new Date("2020-11-15T01:00:00"),
         like: 14 
      },
      {
         user:'user7',
         message: 'Good Movie!',
         dateCreated: new Date("2020-10-15T08:00:00"),
         like: 2
      }
   ]
},
{
   title: 'Seven', 
   directed_by: 'David Fincher',
   stars: ['Morgan Freeman', 'Brad Pitt',  'Kevin Spacey'],
   tags: ['drama','mystery','thiller'],
   debut: new Date("1995-10-22T01:00:00"),
   likes: 134370,
   dislikes: 1037,
   comments: [	
      {
         user:'user3',
         message: 'Love Kevin Spacey',
         dateCreated: new Date("2020-12-15T01:00:00"),
         like: 0 
      },
      {
         user:'user2',
         message: 'Good works!',
         dateCreated: new Date("2020-10-15T11:22:33"),
         like: 14 
      },
      {
         user:'user7',
         message: 'Good Movie!',
         dateCreated: new Date("2020-08-15T01:00:00"),
         like: 2
      }
   ]
}
])
结果: `BulkWriteResult({ "writeErrors": [ ], "writeConcernErrors": [ ], "nInserted": 2, "nUpserted": 0, "nMatched": 0, "nModified": 0, "nRemoved": 0, "upserted": [ ] })`

执行db.movie.find({'directed_by':'David Fincher'}).pretty()
结果返回了在数据中的key包含了:directed_by=David Fincher的两个数据

也可以添加多个筛选条件
执行db.movie.find({'directed_by':'David Fincher', 'stars':'Morgan Freeman'}).pretty()
结果先匹配了directed_by为David Fincher的两个集合,并在两个集合中继续筛选出stars为Morgan Freeman的数据

也可以添加更复杂的筛选条件
例如:
db.movie.find( { $or: [ {'stars':'Robin Wright'}, {'stars':'Morgan Freeman'} ] }).pretty()

还可以设置一个范围内的搜索,例如:500000以上观众赞的电影

db.movie.find({'likes':{$gt:500000}}).pretty()
去掉key的单引号也可以写成:db.movie.find({likes:{$gt:500000}}).pretty()
结果:

点击查看代码
{
  "_id": ObjectId("626212722f7f8c4c618da7f9"),
  "title": "Forrest Gump",
  "directed_by": "Robert Zemeckis",
  "stars": [
    "Tom Hanks",
    "Robin Wright",
    "Gary Sinise"
  ],
  "tags": [
    "drama",
    "romance"
  ],
  "debut": ISODate("1994-07-05T16:00:00Z"),
  "likes": 864367,
  "dislikes": 30127,
  "comments": [
    {
      "user": "user1",
      "message": "My first comment",
      "dateCreated": ISODate("2020-10-14T16:00:00Z"),
      "like": 0
    },
    {
      "user": "user2",
      "message": "My first comment too!",
      "dateCreated": ISODate("2019-04-14T16:00:00Z"),
      "like": 0
    }
  ]
}

类似的还有:$lte小于:或$gte大于等于;$ne:不:不等于。

注意,对于包含多个值的key,同样可以用来查询。
db.movie.find({'tags':'romance'})

只查找最早存储的一个可以执行
db.movie.findOne({'title':'Forrest Gump'})

如果你有很多数据,可以在第一条数据的前提下,进一步筛选,使用limit()限制显示的个数,使用skip(2)示是指定从第二个包括第二个,开始查找并显示

本地查询

执行db.movie.find({'tags':'drama'},{'debut':1,'title':1}).pretty()
结果查找集合中的所有数据的key =tags,其value为drama的数据,此时集合中数据为3个,返回他们的数据的标签,以及首次上映日期,1表示返回。0表示不返回,默认为0,_id一定会返回,所以除外

更新数据

如果有人对Seven电影点了赞,则需要将likes建的值加一,可以使用一下命令重新设置该值

执行:db.movie.updateOne({title:'Seven'}, {$set:{likes:134371}})

MongoDB提供了更好的自增的方法,不需要知道原有的值,可以在其基础上做运算
执行:
db.movie.updateOne({title:'Seven'}, {$inc:{likes:2}})

执行:可以对指定的key的所指定的值都做运算:下面的语句为更新带有key为likes的全部数据,全部增加10
db.movie.updateMany({}, {$inc:{likes:10}})

在原数据中的key中,插入需要增加的value值。

执行:db.movie.updateOne({'title':'Seven'}, {$push:{'tags':'popular'}})

删除数据

删除其中的句法并找到很相似的,例如,要删除标签为浪漫的电影,则:
db.movie.deleteOne({'tags':'romance'})
考虑到我们的数据库记录异常,不要建议你删除少量命令。同样地,该记录条件的第一条记录。如果要删除的所有记录,则使用deleteMany

索引

添加索引

给文档的建添加上索引。可以迅速搜索
例如:给导演这个key增加索引
执行:1为升序索引,-1为降序索引
db.movie.ensureIndex({directed_by:1})

制定规则顺序显示

比如按名字首字母进行:1为升序索引,-1为降序索引
db.movie.find().sort({'title':1}).pretty()
执行:db.movie.getIndexes()
将返回所有索引,包括其名字
执行:db.movie.dropIndex('index_name')
将删除的索引。

聚合:

不重复的查出该key类的所有值,

语法:.aggregate({$group:'key_name},{$sum:num or $key_name })

执行:db.movie.aggregate([{$group:{_id:'$grade'}}])
打印出所有对象数据指定key,以及vlaue值,其value相同的只会出现一次
结果:
{ "_id": 2 } { "_id": 1 }
又如执行:
db.movie.aggregate([{$group:{_id:'$likes'}}])
结果:
{ "_id": 134370 } { "_id": 224360 } { "_id": 864367 }

需求:找出所有导演
执行:
db.movie.aggregate([{$group:{_id:'$directed_by'}}])
结果:
{ "_id": "Robert Zemeckis" } { "_id": "David Fincher" }

需求:查找出所有导演名字,并统计他们的电影数量
执行:
db.movie.aggregate([{$group:{_id:'$directed_by',num_movie:{$sum:1}}}])
结果:
{ "_id": "David Fincher", "num_movie": 2 }
{ "_id": "Robert Zemeckis", "num_movie": 1 }
注意$sum后面接数字,则表示查找到该类,就累计1,直到查找结束,求出他的总数,也可以使用$key_name, 把另外一个数据统计出来,我们可以把这两位导演的赞誉累加出来:
执行:
db.movie.aggregate([{$group:{_id:'$directed_by',num_likes:{$sum:'$likes'}}}])
结果:
{ "_id": "Robert Zemeckis", "num_likes": 864367 }
{ "_id": "David Fincher", "num_likes": 358730 }
需求:统计平均的赞
执行:
db.movie.aggregate([{$group:{_id:'$directed_by',num_movie:{$avg:'$likes'}}}])
结果:
{ "_id": "Robert Zemeckis", "num_movie": 864367 }
{ "_id": "David Fincher", "num_movie": 179365 }
需求:返回每个导演的电影中的第一部的赞数
执行:
db.movie.aggregate([{$group:{_id:'$directed_by',num_movie:{$first:'$likes'}}}])
结果:
{ "_id": "Robert Zemeckis", "num_movie": 864367 }
{ "_id": "David Fincher", "num_movie": 224360 }

findAndModify实现仓库的商品数量的同步:入货和出货实时更新

MongoDB提供了findAndModify一些方法来确保原子操作

db.movie.findAndModify(
			{
			query:{'title':'Forrest Gump'},
			update:{$inc:{likes:10}}
			}
		      )

当数据发生改变时,将该数据进行运算统计操作

文本搜索

除了介绍文本的各种深入查询功能,MongoDB 还支持搜索。在搜索之前,我们需要先对要搜索的关键文本建立一个索引。假设我们要对标题进行文本搜索,我们可以先这样
执行:
db.movie.ensureIndex({title:'text'})
需求:对标题文本搜索
执行:注意文字和搜索前面的$符号
db.movie.find({$text:{$search:"Gump"}}).pretty()
结果:

点击查看代码
{
  "createdCollectionAutomatically": false,
  "numIndexesBefore": 2,
  "numIndexesAfter": 3,
  "ok": 1
}
lizongxiao(mongod-4.2.3) tutorial> db.movie.find({$text:{$search:"Gump"}}).pretty()
{
  "_id": ObjectId("626226c3e3d7ba2f5a3cb067"),
  "title": "Forrest Gump",
  "directed_by": "Robert Zemeckis",
  "stars": [
    "Tom Hanks",
    "Robin Wright",
    "Gary Sinise"
  ],
  "tags": [
    "drama",
    "romance"
  ],
  "debut": ISODate("1994-07-05T16:00:00Z"),
  "likes": 864367,
  "dislikes": 30127,
  "comments": [
    {
      "user": "user1",
      "message": "My first comment",
      "dateCreated": ISODate("2020-10-14T16:00:00Z"),
      "like": 0
    },
    {
      "user": "user2",
      "message": "My first comment too!",
      "dateCreated": ISODate("2019-04-14T16:00:00Z"),
      "like": 0
    }
  ],
  "grade": 1
}
**如果要搜索的密钥是一个很长的文档,文本搜索的方便性就显现出来**

正则表达式搜索

需求:查找电影标题中带有字母b的电影
执行:
db.movie.find({title:{$regex:'.*b$'}}).pretty()
结果:

点击查看代码
{
  "_id": ObjectId("626226c9e3d7ba2f5a3cb068"),
  "title": "Fight Club",
  "directed_by": "David Fincher",
  "stars": [
    "Brad Pitt",
    "Edward Norton",
    "Helena Bonham Carter"
  ],
  "tags": "drama",
  "debut": ISODate("1999-10-14T16:00:00Z"),
  "likes": 224360,
  "dislikes": 40127,
  "comments": [
    {
      "user": "user3",
      "message": "My first comment",
      "dateCreated": ISODate("2020-10-14T17:00:00Z"),
      "like": 0
    },
    {
      "user": "user2",
      "message": "My first comment too!",
      "dateCreated": ISODate("2020-11-14T17:00:00Z"),
      "like": 14
    },
    {
      "user": "user7",
      "message": "Good Movie!",
      "dateCreated": ISODate("2020-10-15T00:00:00Z"),
      "like": 2
    }
  ],
  "grade": 2
}

也可以写成:
db.movie.find({title:/.*b$/}).pretty()

需求:寻找标题带了战斗的标题
执行:
db.movie.find({title:/Fight/}).pretty()
结果:

点击查看代码
{
  "_id": ObjectId("626226c9e3d7ba2f5a3cb068"),
  "title": "Fight Club",
  "directed_by": "David Fincher",
  "stars": [
    "Brad Pitt",
    "Edward Norton",
    "Helena Bonham Carter"
  ],
  "tags": "drama",
  "debut": ISODate("1999-10-14T16:00:00Z"),
  "likes": 224360,
  "dislikes": 40127,
  "comments": [
    {
      "user": "user3",
      "message": "My first comment",
      "dateCreated": ISODate("2020-10-14T17:00:00Z"),
      "like": 0
    },
    {
      "user": "user2",
      "message": "My first comment too!",
      "dateCreated": ISODate("2020-11-14T17:00:00Z"),
      "like": 14
    },
    {
      "user": "user7",
      "message": "Good Movie!",
      "dateCreated": ISODate("2020-10-15T00:00:00Z"),
      "like": 2
    }
  ],
  "grade": 2
}
**以上查找都是区分大小写的,如果不想要区分大小写,则可以这样** 执行: `db.movie.find({title:{$regex:'fight.*b',$options:'$i'}}).pretty()`

结果:也能查到大写,或者小写的电影

JS正写法

db.movie.find({title: /fight.*b/i}).pretty()

posted @ 2022-04-22 10:45  Chiffon1996  阅读(52)  评论(0)    收藏  举报