MongoDB数据插入
昨天学到,在MongoDB中插入数据,使用如下三种语句插入数据(类似于Mysql中的insert语句):
db.colletion1.insert({"huidong1":"huidong1"}) db.colletion2.insertOne({"huidong2":"huidong2"}) db.colletion3.insertMany([{"huidong3":"huidong3"},{"huidong4":"huidong4"}])
前面两条是等价的,后面一条用于插入多条数据。插入的数据,没有固定的限制(不像Mysql中规定了2个字段的表,插入的时候必须要插入一组两个字段的数据),比如:
db.colletion1.insert({"huidong5":"huidong5","name":"张三","age":18}) db.colletion3.insertMany([{"huidong6":"huidong6"},{"huidong7":"huidong7","name":"张三"}])
可以看到第一条语句我在colletion1集合中插入了一条和之前数据结构不相同的数据,在colletion3集合中插入了两组数据结构不相同的数据,都是可以成功的,使用db.colletion3.find()查询集合相关数据,可以看到数据正常存储:
> db.colletion3.find() { "_id" : ObjectId("5b723c36cf3a7a471b1d4adc"), "huidong3" : "huidong3" } { "_id" : ObjectId("5b723c36cf3a7a471b1d4add"), "huidong4" : "huidong4" } { "_id" : ObjectId("5b723c3ecf3a7a471b1d4ade"), "huidong6" : "huidong6" } { "_id" : ObjectId("5b723c3ecf3a7a471b1d4adf"), "huidong7" : "huidong7", "name" : "张三" }
这个"_id"是什么意思呢?之前说过,MongoDB使用"_id"来作为一个集合中的主键。如果插入的数据中,没有"_id"这个字段,那么MongoDB会自动创建一个"_id",值类型为ObjectId,MongoDB通过时间戳来产生一个单独的ObjectId而不是通过自增长。不同的集合中的"_id"的值可能会一样,但是同一个集合下的"_id"的值不一样。我们在colletion3集合中再添加一条数据:
> db.colletion3.insert({"_id":1001,"huidong8":"huidong8"}) WriteResult({ "nInserted" : 1 }) > db.colletion3.find() { "_id" : ObjectId("5b723c36cf3a7a471b1d4adc"), "huidong3" : "huidong3" } { "_id" : ObjectId("5b723c36cf3a7a471b1d4add"), "huidong4" : "huidong4" } { "_id" : ObjectId("5b723c3ecf3a7a471b1d4ade"), "huidong6" : "huidong6" } { "_id" : ObjectId("5b723c3ecf3a7a471b1d4adf"), "huidong7" : "huidong7", "name" : "张三" } { "_id" : 1001, "huidong8" : "huidong8" }
此时,我们再添加一个"_id"值为1001的数据就会报错,在其他集合中添加"_id"值为1001的数据不会报错。
如果插入数据过多,可以使用如下方式插入:
> res = {"_id":1002,"huidong9":"huidong9"} { "_id" : 1002, "huidong9" : "huidong9" } > db.colletion3.insert(res) WriteResult({ "nInserted" : 1 }) > db.colletion3.find() { "_id" : ObjectId("5b723c36cf3a7a471b1d4adc"), "huidong3" : "huidong3" } { "_id" : ObjectId("5b723c36cf3a7a471b1d4add"), "huidong4" : "huidong4" } { "_id" : ObjectId("5b723c3ecf3a7a471b1d4ade"), "huidong6" : "huidong6" } { "_id" : ObjectId("5b723c3ecf3a7a471b1d4adf"), "huidong7" : "huidong7", "name" : "张三" } { "_id" : 1001, "huidong8" : "huidong8" } { "_id" : 1002, "huidong9" : "huidong9" }
save()保存跟新数据:save()方法和insert()方法的区别在于,save会先判断集合当中是否存在相同的文档,如果存在不执行插入,如果不存在则执行插入。 比如:在colletion3中,已经存在一条数据{"huidong8":"huidong8"},此时我们写入如下语句:
db.colletion3.insert({"_id":1001,"huidong8":"huidong8"}) //会报错,提示主键id冲突,如果不加"_id"字段,则会插入一条新的"_id"不同的数据 db.colletion3.save({"_id":1001,"huidong8":"huidong8"}) //不会报错,如果插入{"_id":1001,"huidong10":"huidong10","age":22},则原来这条数据会跟新成后面插入的数据