这里我们主要使用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()