MongoDB自学笔记9---4.1插入文档
MongoDB自学笔记9---4.1插入文档
MongoDB自学笔记8--- 3.3 MongoDB Shell简介及简单使用
http://www.zzzyk.com/database/201308/235975.html
第四章 详解增删改查
对于数据库来说,如果我们不是DBA使用的最多的是CRUD,如果我们学好了CRUD,将来我们操作数据库中的数据的时候,将会得心应手。本章将会详细的介绍mongodb中的CRUD操作。
4.1 插入文档
对于数据库的CRUD操作,所有的都应该起源于C,如果没有C其他的几个也就没有意义了,所以我们先介绍一下C,也就是插入文档。
在mongodb中可以使用insert或者save方法或者update方法将一个数据插入到一个集合中。
对于insert来说,如果易做图入数据字集合中不存在,能够正常插入,如果已经存在集合中,将会无法插入。insert方法语法如下:
db.collection.insert( <document> )
例如我们将一个用户插入到user集合中,代码如下:
> db.user.insert({name:"xiangyue",age:23}) > db.user.find() { "_id" : ObjectId("519cbddfe9c1b21d76cc927c"), "name" : "xiangyue", "age" : 23 }
在我们插入文档的时候,如果我们没有为该文档指定_id,mongodb将会为我们的文档自动创建一个不会重复的ObjectId,关于ObjectId的具体信息查看3.2Mongodb数据类型。
如果我们在insert中传入了多个文档,mongodb只会插入第一个文档,下面的代码中只插入了第一个文档。
> db.test.find() > db.test.insert({name:"user1"},{name:"user2"}) > db.test.find() { "_id" : ObjectId("519cd757f83727a8baf0a8e2"), "name" : "user1" }
如果我们想一次插入多个文档,可以将多个文档组合成一个数组,这样就能够插入成功了,例子代码如下:
> db.test.find() > db.test.insert([{name:"user1"},{name:"user2"}]) > db.test.find() { "_id" : ObjectId("519cd842f83727a8baf0a8e3"), "name" : "user1" } { "_id" : ObjectId("519cd842f83727a8baf0a8e4"), "name" : "user2" }
我们可以使用javascript批量插入数据。由于mongodb shell简单的说就是一个javascript shell所以javascript代码可以在mongodb shell中运行,所以我们可以使用javascript代码进行批量插入数据,例如我们插入10个用户到user集合中,代码如下:
> for(i=1;i<=10;i++){ ... db.user.insert({_id:i,name:"user"+i,age:10+i}) ... } > db.user.find() { "_id" : ObjectId("519cbddfe9c1b21d76cc927c"), "name" : "xiangyue", "age" : 23 } { "_id" : 1, "name" : "user1", "age" : 11 } { "_id" : 2, "name" : "user2", "age" : 12 } { "_id" : 3, "name" : "user3", "age" : 13 } { "_id" : 4, "name" : "user4", "age" : 14 } { "_id" : 5, "name" : "user5", "age" : 15 } { "_id" : 6, "name" : "user6", "age" : 16 } { "_id" : 7, "name" : "user7", "age" : 17 } { "_id" : 8, "name" : "user8", "age" : 18 } { "_id" : 9, "name" : "user9", "age" : 19 } { "_id" : 10, "name" : "user10", "age" : 20 }
对于save方法,如果易做图入数据不存在集合中,正常插入,如果存在,则更新该数据。save方法语法如下:
db.collection.insert( <document> )
例子代码:
> db.test.find() { "_id" : 1, "name" : "xiangyue", "age" : 23 } { "_id" : 2, "name" : "zhangsan", "age" : 23 } > db.test.save({_id:3,name:"lisi",age:24}) /*集合中不存在,插入数据*/ > db.test.find() { "_id" : 1, "name" : "xiangyue", "age" : 23 } { "_id" : 2, "name" : "zhangsan", "age" : 23 } { "_id" : 3, "name" : "lisi", "age" : 24 } > db.test.save({_id:3,name:"wangwu",age:25}) /*数据库中存在该数据,更新该数据*/ > db.test.find() { "_id" : 1, "name" : "xiangyue", "age" : 23 } { "_id" : 2, "name" : "zhangsan", "age" : 23 } { "_id" : 3, "name" : "wangwu", "age" : 25 }
对于update,我们看到这个方法我们想到的这个是更新一个文档的,怎么还能插入呢,但是官方就使update能够插入数据。Update方法有一个参数upsert参数,如果设置为true的话,如果被更新的文档不存在将会插入该文档,这个就类似save方法了。Upsert默认为false,所以默认情况下,如果查找不到需要更新的数据,则并不会更新该数据了。对于update方法这里只是简单给出一个例子代码,具体介绍请看4.4更新文档:
> db.test.find() { "_id" : 1, "name" : "xiangyue", "age" : 23 } { "_id" : 2, "name" : "zhangsan", "age" : 23 } { "_id" : 3, "name" : "wangwu", "age" : 26 } > db.test.update({_id:4},{_id:4,name:"lisi",age:26}) > db.test.find() { "_id" : 1, "name" : "xiangyue", "age" : 23 } { "_id" : 2, "name" : "zhangsan", "age" : 23 } { "_id" : 3, "name" : "wangwu", "age" : 26 } > db.test.update({_id:4},{_id:4,name:"lisi",age:26},{upsert:1}) /*设置了upsert为true后,数据不存在的时候插入了*/ > db.test.find() { "_id" : 1, "name" : "xiangyue", "age" : 23 } { "_id" : 2, "name" : "zhangsan", "age" : 23 } { "_id" : 3, "name" : "wangwu", "age" : 26 } { "_id" : 4, "name" : "lisi", "age" : 26 }
4.1.1不安全写操作
MongoDB为了追求赢得基准测试导致它默认以不安全的方式进行写操作。 如果你不调用getLastError(),MongoDB会在写操作实际完成之前就返回了,但是用户并不知道这次写操作失败了。所以使用mongodb的时候对于数据的完整性要求高的应用程序,需要调用getLastError方法,确认正确的写入了数据。