03.创建、更新和删除文档。

插入:

>db.collectionName.insert({"bar":"baz")}

批量插入:
如果要向集合插入多个文档,使用批量插入会快一些。

batchInsert函数实现批量插入,它接受一个文档数组作为参数。

>db.collectionName.batchInsert([ {"_id:0}, {"_id":1}, {"_id":2} ])

>db.collectionName.find()

{"_id:0}

{"_id":1}

{"_id":2}

删除文档:

>db.collectionName.remove({})

上述命令只删除集合里面的文档,并不会删除集合本身,也不会删除集合的元信息。

remove函数可以接受一个查询文档作为限定条件作为可选参数。给定参数后,符合条件的文档才会被删除。

>db.collectionName.remove({"xxxx":true})

删除数据是永久性的,不能撤销,也不能恢复。

删除速度:

删除文档通常很快,但是如果要清空集合,使用drop直接删除集合会更快。

例如,插入测试数据:

>for (var i=0; i < 1000000; i++) {

... db.tmps.insert({"foo":i})

... }

使用remove删除,并记录花费时间:

var timeRemoves = function() {

var start = (new Date()).getTime();

db.tmps.remove({});

db.tmps.findOne();//Make sure the remove finishes before continuing

var timeDiff = (new Date()).getTime() - start;

print("Remove took:"+timeDiff+"ms");

}

更新文档:

db.collection.update(

   <query>,

   <update>,

   {

     upsert: <boolean>,

     multi: <boolean>,

     writeConcern: <document>

   }

)

update有两个参数,一个是查询文档,用于定位需要更新的文档,另一个是修改器(modifier)文档,用于说明要对找到的文档进行哪些修改。

更新操作是不可分割的:若是两个更新同时发生,先到达服务器的先执行,接着执行令一个。

·文档替换:

最简单的更新就是用一个新文档完全替换匹配的文档。这适用于进行大规模式迁移的情况。

例:

默认文档结构:

>db.tmps.findOne()

{

"_id" : ObjectId("54f125773d3fab4bb9d6dc63"),

"Name" : "joe",

"Friends" : 32,

"Enemies" : 2,

"Date" : ISODate("2015-02-28T02:18:21.858Z")

}

写一个definetmps.js文档,内容如下:

var replaceupdate = function(){

db.tmps.findOne();

var joe = db.tmps.findOne({"Name":"joe"});

joe.relationships = {"Friends":joe.Friends,"Enemies":joe.Enemies};

joe.Username = joe.Name;

delete joe.Friends;

delete joe.Enemies;

delete joe.Name;

db.tmps.update({"Name":"joe"},joe);

db.tmps.findOne();

}

然后再Shell中加载,并执行函数replaceupdate(),最后验证文档结构:

>load("definetmps.js")

true

>replaceupdate()

>db.tmps.findOne()

{

"_id" : ObjectId("54f125773d3fab4bb9d6dc63"),

"Date" : ISODate("2015-02-28T02:18:21.858Z"),

"relationships" : {

"Friends" : 32,

"Enemies" : 2

},

"Username" : "joe"

}

一个常见的错误是查询条件匹配到了多个文档,然后更新时由于第二个参数存在就产生重复的"_id"值。数据库就会抛出错误,任何文档都不会更新。

·使用修改器:

通常文档只会有一部分要更新。可以使用原子性的更新修改器,指定对文档中的某些字段进行更新。

1."$set"修改器入门:

"$set"用来指定一个字段的值。如果这个字段不存在,则创建它。这对更新模式或增加用户自定义键来说非常方便。

例:存储用户资料的文档,结构如下,

>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 32,

"sex" : "male",

"location" : "Wisconsin"

}

我们要添加一个新键,用户喜欢的书籍进去,可以使用"$set":

>db.tmps.update({"_id" : ObjectId("54f131d0f755cba4f8d7cb2a")},

... {"$set" : {"favorite book" : "war and peace"}})

然后我们文档就有了新键:

>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 32,

"sex" : "male",

"location" : "Wisconsin",

"favorite book" : "war and peace"

}

这个时候喜欢书的键已经存在了,用户想换一本,可直接通过$set完成更新。

用"$set"甚至可以修改键的类型。例如用户喜欢很多本书,就可以将"favorite book"键值变成一个数组:

>db.tmps.update({"_id" : ObjectId("54f131d0f755cba4f8d7cb2a")},

... {"$set" : {"favorite book" : ["book1","book2","book3"]}})

如果用户不喜欢读书,可以用"$unset"将这个键值完全删除。

>db.tmps.update({"_id" : ObjectId("54f131d0f755cba4f8d7cb2a")},

... {"$unset" : {"favorite book" : 1}})

也可以用"$set"修改内嵌文档:

>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 32,

"sex" : "male",

"location" : "Wisconsin",

"contact" : {

"email" : "[email protected]",

"pnum" : "13212342112"

}

}

>db.tmps.update({"name":"joe"},

... {"$set":{"contact.email":"[email protected]"}})

>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 32,

"sex" : "male",

"location" : "Wisconsin",

"contact" : {

"email" : "[email protected]",

"pnum" : "13212342112"

}

}

2.增加和减少"$inc"

"$inc"修改器用来增加已有键的值,改键不存在就会创建一个。

"$inc"与"$set"的用法类似,就是专门用来增加和减少数字的。"$inc"只能用于整形、长整形或双精度浮点型的值。

>db.tmps.update({"name":"joe"},

... {"$inc":{"age":1}})

>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 33,

"sex" : "male",

"location" : "Wisconsin",

"contact" : {

"email" : "[email protected]",

"pnum" : "13212342112"

}

}

3.数组修改器

有一大类很重要的修改器可用于操作数组。数组是常用且非常有用的数据结构:它们不仅是可通过索引进行引用的列表,而且还可以作为数据集(set)来用。

4.添加元素"$push"

如果数组已经存在,"$push"会向已有数组末尾添加一个元素,没有则创建一个新数组。

如:

>db.tmps.update({"name":"joe"},

... {"$push":{"comments":{"name":"bob","email":"[email protected]"}}})

还添加继续使用"$push",这是一种比较简单的"$push"使用形式,也可以将它应用在一些比较复杂的数组操作中。

使用"$each"子操作符,可以通过一次"$push"操作添加多个值。

db.tmps.update({"name":"joe"},

... {"$push":{"comments":{"$each":[{"name":"bob","email":"[email protected]"},{"name":"carlo","email":"[email protected]"}]}}})

PS:通过"$set"的实现:

>db.tmps.update({"name":"joe"},

... {"$set":{"comments":[{"name":"bob","email":"[email protected]"},{"name":"carlo","email":"[email protected]"}]}})

如果希望数组的最大长度是固定的,那么可以将"$slice"和"$push"组合在一起使用,这样就可以保证数组不会超出设定好的最大长度,这实际上就得到了一个最多包含N个元素的数组。

>db.tmps.update({"name":"joe"},

... {"$push":{"favoritetop":{

...   "$each":[{"name":"book","level":3},

...            {"name":"music","level":1},

...            {"name":"movie","level":4},

...            {"name":"run","level":2}],

...   "$slice":-3,

...   "$sort":{"level":-1}}}})

注意:不能只将"slice"或者"$sort"与"$push"配合使用,且必须使用"$each"。

5.将数组作为数据集使用

如果将数组作为数据集使用,保证数组元素不会重复。可以在查询文档中用"$ne"来实现。

(test)>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 43,

"emails" : [

"[email protected]",

"[email protected]",

"[email protected]"

]

}

>db.tmps.update({"emails":{"$ne":"[email protected]"}}, {"$push":{"emails":"[email protected]"}})

WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

>db.tmps.update({"emails":{"$ne":"[email protected]"}}, {"$push":{"emails":"[email protected]"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

由这里可以看出,$ne是在查询中做判断的,如果判断内容不存在则执行后面的$push操作。

也可以用"$addToSet"来实现:

>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 43,

"emails" : [

"[email protected]",

"[email protected]",

"[email protected]"

]

}

>db.tmps.update({"name":"joe"},

... {"$addToSet":{"emails":"[email protected]"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

>db.tmps.update({"name":"joe"},

... {"$addToSet":{"emails":"[email protected]"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

(test)>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 43,

"emails" : [

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]"

]

}

将"$addToSet"和"$each"组合起来,可以添加多个不同的值,而使用"$ne"和"$push"组合则不能实现。

>db.tmps.update({"name":"joe"},

... {"$addToSet":{"emails":{"$each":[

... "[email protected]","[email protected]","[email protected]","[email protected]"]}}})

6.删除元素

有几个从数组中删除元素的方法。若是把数组看成队列或者栈,可以用"$pop"这个修改器从数组任何一端删除元素。

>db.tmps.update({"name":"joe"},

... {"$pop":{"emails":1}})    //从数组末尾删除元素。

>db.tmps.update({"name":"joe"}, {"$pop":{"emails":-1}})   //从数组开头删除元素。

有时需要基于特定条件来删除元素,而不仅仅是依据元素位置,这时可以用"$pull"。它会将所有匹配文档全部删除,而不是只删除一个。对数组[1,1,2,1]执行pull 1,结果就只剩一个元素的数组[2]。

7.基于位置的数组修改器

通过位置或者定位操作符("$"):

数组下标都是以0开始的,可以将下标直接作为建来选择元素。

>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 43,

"emails" : [

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]"

]

}

>db.tmps.update({"name":"joe"},

... {"$set":{"emails.3":"[email protected]"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 43,

"emails" : [

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]"

]

}

很多情况下,不预先查询文档就不能知道要修改数组的下标,为了解决这个问题,Mongodb提供了定位操作符"$",用来定位查询已经匹配的数组元素,并进行更新。如下:

>db.blog.findOne()

{

"_id" : ObjectId("54f56483d9c146390ce21c58"),

"title" : "my frist blog.",

"content" : "a b c d e f g ....",

"comments" : [

{

"comment" : "good",

"author" : "joe",

"votes" : 0

},

{

"comment" : "it‘s ok",

"author" : "john",

"votes" : 2

}

]

}

>db.blog.update({"comments.author":"joe"},

... {"$set":{"comments.$.author":"jim"}})

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

>db.blog.findOne()

{

"_id" : ObjectId("54f56483d9c146390ce21c58"),

"title" : "my frist blog.",

"content" : "a b c d e f g ....",

"comments" : [

{

"comment" : "good",

"author" : "jim",

"votes" : 0

},

{

"comment" : "it‘s ok",

"author" : "john",

"votes" : 2

}

]

}

注意,定位符只更新第一个匹配元素。

特殊的更新:upsert

upsert更新,要是没有找到符合更新条件的文档,就会以这个条件和更新文档为基础创建一个新的文档。如果找到匹配文档,则正常更新。

update操作的第三个参数处为true,则是upsert更新!

db.test.update({"url":"www.example.com"}, {"$inc":{"pageviews":1}},true)    // 此为简写

db.test.update({"url":"www.example.com"}, {"$inc":{"pageviews":1}},{upsert:true})

save函数:

使用save函数时,如果文档不存在,它会自动创建文档;如果文档存在,它就更新这个文档。它只有一个参数:文档。如果这个文档有"_id"键,save会调用upsert;否则调用insert。

>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 43,

"emails" : [

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]"

]

}

>var x = db.tmps.findOne()

(test)>x.age = 23

23

>db.tmps.save(x)

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

>db.tmps.findOne()

{

"_id" : ObjectId("54f131d0f755cba4f8d7cb2a"),

"name" : "joe",

"age" : 23,

"emails" : [

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]",

"[email protected]"

]

}

更新多个文档:

默认情况,更新只对匹配条件的第一个文档执行操作。要更新所有匹配,可以将update的第四个参数设置为true。

>db.tmps.find()

{ "_id" : ObjectId("54f131d0f755cba4f8d7cb2a"), "name" : "joe", "age" : 23 }

{ "_id" : ObjectId("54f6aa46d9c146390ce21c5f"), "name" : "peter", "age" : 23 }

{ "_id" : ObjectId("54f6aa4cd9c146390ce21c60"), "name" : "carlo", "age" : 23 }

>db.tmps.update({"age":23}, {"$set":{"age":24}},false,true)     //简写方式

>db.tmps.update({"age":23}, {"$set":{"age":24}},{upsert:false,multi:true})

>db.tmps.find()

{ "_id" : ObjectId("54f131d0f755cba4f8d7cb2a"), "name" : "joe", "age" : 24 }

{ "_id" : ObjectId("54f6aa46d9c146390ce21c5f"), "name" : "peter", "age" : 24 }

{ "_id" : ObjectId("54f6aa4cd9c146390ce21c60"), "name" : "carlo", "age" : 24 }

写入安全机制(write concern)

是一种客户端设置,用于控制写入的安全级别。

PS:内容整理于《Mongodb权威指南》

时间: 2024-08-11 03:37:07

03.创建、更新和删除文档。的相关文章

MongoDB创建、更新及删除文档

1.1插入并保存文档 插入是向MongoDB中添加数据的基本方法.对目标机使用insert方法,插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个"_id"键(要是原来没有的话),然后将其保存到MongoDB中. 1.1.1 批量插入 如果要插入多个文档,使用批量插入会快一些.批量插入能传递一个由文档构成的数组给数据库.只有插入多个文档到一个集合的时候,这种方式才会有用,而不能批量插入

MongoDB学习笔记二:创建、更新及删除文档

插入并保存文档 对目标集使用insert方法插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个"_id"键(要是原来没有的话),然后将其保存到MongoDB中.批量插入 如果要插入多个文档,使用批量插入会快一些.批量插入传递一个由文档构成的数组给数据库.如果只是导入数据(例如,从数据feed或者MySQL中导入),可以使用命令行工具,如mongoimport,而不是使用批量插入. 删除

MongoDB学习笔记-创建、更新、删除文档

创建 MongoDB中使用insert方法来向集合插入文档,然后保存到MongoDB中. db.foo.insert({“hehe”:”呵呵”}) 如果想批量插入的话可以使用下面这种形式:db.foo.insert([{“hehe”:”呵呵”},{“haha”:”哈哈”}]) 插入校验 插入数据时MongoDB只对数据进行最基本的检查-检查文档的基本结构.如果没有“_id”字段,就会自动增加一个,所有文档都必须小于16MB(这个值是MongoDB设计者人为定义的,未来可能会增加).这样的限制主要

创建、更新、删除文档。 --- Mongodb权威指南阅读。

插入文档: db.foo.insert({ "key" : "value"}); 使用insert插入一个数据,文档中如果没有_id 会自动给文档增加_id. batchInsert(Array)  批量插入,接受一个文档数组做参数. 使用批量插入最大长度48M,如果过程中一个失败,失败之前会插入成功,之后全都失败. 可以设置continueOnError 选项设置忽略错误并且继续插入. 插入校验: 所有文档必须都小于16M. 删除文档: db.foo.remove

mongoDB更新和删除文档(document)

整理来自 https://www.shiyanlou.com/courses/running/57 启动 $ sudo service mongodb start 进入MongoDB命令行操作界面,在命令行中敲exit可以退出 $ mongo 实验中的布尔类型的ture用1代替,false用0代替 创建数据库 范例:进入mongoDB命令行操作界面之后,进行如下操作: > use Chenshi switched to db Chenshi 您可以使用db命令查看您当前选择的数据库 > db

MongoDB数据库更新和删除文档

创建集合 createCollection() <span style="font-size:14px;">name:创建的集合名称 options:是一个作为初始化的文档(可选)</span> <span style="font-size:14px;">> db.createCollection("jingdong") #无参数 { "ok" : 1 } > show coll

MongoDB创建\更新\删除文档操作

?? 一.插入\创建文档 --当插入一个不存在的文档时,会自动创建一个文档 [[email protected] ~]# mongo MongoDB shell version: 2.4.14 connecting to: test > show collections > db.cols.insert({bar:"baz"}) > db.cols.find() { "_id" :ObjectId("56aac1df4e61b6d9f84

MongoDB(二)创建更新删除文档

插入并保存文档操作 用insert向目标集合插入文档,如果没有_id键则会自动添加.最后自动保存. >db.foo.insert({"bar":"baz"}) 如果要批量插入怎么办呢,看下面代码: >db.foo.insert([{"_id":0},{"_id":1},"{"_id":2}]) 以前有一个batchInsert函数,现在已经没有了.注意在批量插入的过程中如果有一个文档插

大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作

一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 Elasticsearch 的特点1.7 Elasticsearch 的核心概念1.7.1 近实时1.7.2 Cluster(集群)1.7.3 Node(节点)1.7.4 Index(索引 --> 数据库)1.7.5 Type(类型 --> 表)1.7.6 Document(文档 -->