MongoDB基础操作

1 篇文章 0 订阅
1 篇文章 0 订阅

这里我们主要使用MongoDB shell

1.启动shell命令(这里不在详细阐述)

mongo

2.数据库

MongoDB的数据库之区分集合的命名空间。要产讯MonoDB数据库,需要知道储存文档数据的数据库和集合的名字。如果开始没有指定数据,shell会默认记得test数据库

执行mongo命令后我们,执行命令>

use mytest

进入mytest数据库:

这里我们会看到一个切换数据库成功的提示信息,ps(这里我们可以直接切换到mytest数据库而不需要显示的创建它,其实创建数据库不是必须的。只有才第一次插入数据和集合时才会创建。这个行为符合MongoDB动态操作数据的模式,这样可以简化并加速开发过程。

3.插入和查询

我们向mytest的users集合中插入一条{username: "smith"}的数据.。

插入命令:

 db.users.insert({username:"smith"})

下面WriteResult是数据库反馈给我们的信息,成功插入一条数据

如果插入成功,就已经成功保存了第一个文档。在默认的MongoDb数据库配置里,确保已插入这个数据,即使我们关闭shell或者关机重启。我们可以使用查询来查看我们插入的新的文档数数

查询命令:

db.users.find()

这里我们可以看到窗口输出了我们之前插入的{username: "smith"}数据

Mongodb的_id字段

这里我们可以看到_id字段已经默认添加到文档中了,我们可以吧_id字段的值作为文档中的主键。每个MongoDB文档都需要一个_id,而且如果创建文档时没有_id,那么MonoDB就会撞门创建一个ObjectID添加到文档中。出现在控制台中的ObjectID与代码里面列举的不同,但是在集合中,_id值的作用是保证数据的唯一性,这是基本要求。我们也可以在文档中插入自己的_id。ObjectID是MongoDB默认的。

我们继续向users里买呢添加用户数据

db.users.insert({username:"jones"})

现在我们的users集合里面有两条用户数据,接着我们使用count来验证结果

db.users.count()

我们可以看到终端输出了2,表示我们有两条用户数据存在users集合中

传递查询条件

首先我们使用之前的查询命令来查询所有的用户数据

db.users.find()

这里我们可以看到控制台返回给我们users集合里面所有的用户数据

我们也可以给find方法传递简单的查询条件,查询选择器是用来匹配集合中文档的。要查询集合中username为jones的数据,可以传递简单的条件,语句如下:

db.users.find({username:"jones"})

ps:调用find() 方法若不传入参数,就等价于传递空条件。也就是说,db.users.find()db.users.find({})的效果一样

当然也可以在查询语句中指定多个字段,这样隐式创建and语句。可以使用下面的选择器:

db.users.find({username:"smith",_id:ObjectId("5c04bc29cef8b0b713b42fe6")})

返回结果

查询提阿健会返回等价的文档。条件会使用AND,也就是按并且关系进行查询的,索引必须匹配_id和username字段。也可以是使用MongoDB的$and操作符。之前的查询语句可以修改为:

db.users.find({$and:[
... {_id:ObjectId("5c04bc29cef8b0b713b42fe6")},
... {username:"smith"}
... ]})

返回结果

使用OR查询文档的语法类似:

db.users.find({$or:[
... {_id:ObjectId("5c04bf4fcef8b0b713b42fe7")},
... {username:"smith"}
... ]})

返回结果


4.更新文档

通常有两种类型的更新操作,用于不同的属性和使用场景,其中一个类型的更新是在一个文档或者多个文档上修改,另外一个是使用新的文档取代旧的文档。

我们给smith用户新增国家属性使用$set操作符

db.users.update({username:"smith"},{$set:{country:"Canda"}})

操作结果:

我们来看一下修改结果

替换更新

另一种更新文档的方式就是替换文档,而不是更新某个字段,当使用$set操作符的时候这一点容易混淆。

db.users.update({uesername:"smith"},{country:"Canada"})

返回结果:

在这个操作中文档被替换为只包含country字段的文档,username字段被删除,因为他只是用来匹配文档,第二个参数用来更新替换。当我们在使用这种更新时应该多加注意。我们来看一下我们操作后的数据:

_id相同,但是数据已经被替换为新的文档了。当确定是新增或者修改数据而不是替换整个文档是,就使用$set操作符。

我们再将username属性插入进去:

db.users.update({country:"Canada"},{$set:{username:"smith"}})

如果我们以后不想要country字段了,使用$unset操作符删除即可:

db.users.update({username:"smith"},{$unset:{country:1}})

操作结果

更新复杂数据

我们来给smith用户添加一个favorites属性里面的值为两个键的新对象,它包含喜欢的城市和电影。

如:

{
    username:"smith",
    favorites:{
        cities: ["Chicago","Cheyenne"],
        movies: ["Casablanca","For a Few Dollars More","The Sting"]
    }
}

我们使用smith的文档修改为这个格式,我们可以使用$set操作符:

db.users.update({username:"smith"},
... {
...     $set:{
...         favorites:{
...              cities:["Chicago","Cheyenne"],
...              movies:["Casablanca","For a Few Dollars More", "The Sting"]
...         }
...     }
... })

接着我们选择查询users集合来确保两个更新成功:

db.users.find().pretty()

下面我们使用相同的方式来修改jones数据,我们给jones只添加一些电影信息:

db.users.update({username:"jones"},
... {
...   $set: {
...     favorites: {
...       movies: ["Cassblanca","铁甲小宝"]
...     }
...   }
... })

操作结果

ps:(正如大家所见:pretty()属性可以帮我们自动格式化我们的输出信息,方便我们阅读)

高级更新

如果我们知道喜欢Casablanca的用户也喜欢“变形金刚”,而且想要用更细数据库来反应这个事实,那就需要更复杂的查询。要实现这个功能我们可以再次使用$set操作符,但是这样做的需要从新编写并发送整个电影数组。因为我们想要做的就是给列表添加元素,最好还是使用$push,或者$addToSet。这个两个命令都是往数组中添加数据。但是第二个是唯一的,阻止重复的数据。

db.users.update({"favorites.movies":"Casablanca"},
... {$addToSet:{"favorites.movies":"变形金钢"}},
... false,true)

这里第三个参数是false,控制是否允许upsert。这个命令告诉更新操作,当一个文档不存在的是否插入它,这取决于更新操作是更新还是替换更新。

第四个参数true,表示是否是多个更新。默认情况下,MongoDB更新只针对第一个匹配文档。如果想更新多有匹配的文档就必须显示指定这个参数为true。

我们来看一下执行结果:

5.删除数据

如果没有参数,删除操作将会清空集合里的所有文档。如果要清空foo集合里的所有文档内存,可以使用一下命令:

db.foo.remove()

这里就不演示了

通常我们只需要删除集合中某个文档,因此,我们要传递查询选择其给remove()方法。如果要删除所有喜欢city为sb的用户,这样写:

db.users.remove({"city":"sb"})

如果要删除集合和附属的索引数据可以使用drop() 方法:

db.users.drop()

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值