mongodb插入数据的方法:
1.db.collection.insert()
2.db.collection.insertOne()
3.db.collection.insertMany()
4.db.collection.save()
上述方法的区别:
db.collection.insert() 包括insertOne()和insertMany()的功能。
db.collection.save() 根据_id,如果存在即修改,不存在就插入。
insertMany的限制:
- 每一组操作最大可以有1000个文档。
- 顺序添加的速度要慢于不按顺序添加的。
- 不存在的集合会自动创建。
- insertMany() 也不支持db.collection.explain() 可以使用insert 代替。
- 如果添加出错会报出 BulkWriteError exception 异常,按照顺序添加的 操作遇到错误会直接停止,而不按照顺序的会继续执行在队列中的写操作。
关于upsert: upsert=update+insert 找到更新,找不到就插入
关于replaceOne:默认覆盖找到的第一条数据
参数详解:
1.插入顺序: {ordered:false}:
测试:1.默认不设置ordered参数时,插入多个文本发生错误时是否能跳过错误而不是终止执行
测试准备脚本:for(var i=1;i<5;i++){db.hh.insert({_id:i,name:"h"+i});}
当执行脚本:var array=[];
for(var i=3;i<=8;i++){array.push({_id:i,name:"h"+i});};
db.hh.insert(array);
测试结果:"errmsg" : "E11000 duplicate key error collection: test.hh index: _id_ dup key: { : 3.0 }",主键重复,集合文档数量还是为四条。
2.设置参数,重新执行:脚本变化为db.hh.insert(array,{ordered:false})
测试结果:依然发生主键重复报错,但是集合文档此时发生变化,集合数量为8.
2.写关注:{ writeConcern: { w: "majority", wtimeout: 5000 } }(复制级需要,确定数据写入大部分数据节点,主节点返回写入成功,规定写入超时时间为5000毫秒。)
常见写入报错:
1:检查复制级的当前状态,rs.status()
WriteResult({ "nInserted" : 1, "writeConcernError" : { "code" : 64, "errmsg" : "waiting for replication timed out at shard-a" } })2:主键重复
WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.foo.$_id_ dup key: { : 1.0 }" } })