插入文档
向集合中插入一条或多条文档。语法:
db.collection.insert(
{
//可选字段
writeConcern:<document>
ordered: <boolean>
},
{
//可选字段
writeConcern:<document>
ordered: <boolean>
},
...
)
db为数据库名,collection为集合名,insert为插入文档命令。
可选字段:
- writeConcern:自定义写出错确认级别
- ordered:当值为false时,忽略文档错误,继续执行数组中文档的无序插入。true时(默认值),执行文档中的有序插入,如果某个文档发生错误,命令将返回,不再处理。
返回值:
- insert插入成功,返回插入文档对象
WriteResult({"nInserted":1})
- insert插入失败,返回结果中会包含
WriteResult.writeConcernError
对象字段内容,需要与writeConcern配合使用
说明:
- insert命令,自动产生一个_id值
- insert命令可以用save命令代替。若给save命令指定_id值,则会更新默认的_id值,例如:
db.a.save({_id:1001,x:"OK"})
- 如果没有指定的集合对象,则第一次insert时自动建立集合;若存在集合,则变成多条文档的集合
插入一条简单文档:
插入一条复杂文档:
- insert插入值里可以嵌套文档
- insert命令也可以包含数组,用于记录分类等信息
- 文档数据库接受数据冗余问题
- 如果执行过程出现类似
SyntaxError:missing;before statement @(shell)
则是输入语法结果存在问题
插入多条文档:
用变量方式插入文档:
有序插入多条文档:
假设在person集合里已经有_id:11
的一条记录。那么在执行上述命令时,命令执行将失败。也就是一条文档在_id相同的情况下不能重复插入。
- 在ordered:true时:如果发生错误,就会终止后面的插入
- 在ordered:false时:除了出错记录外,其它记录继续插入
自定义出错确认级别
假设在多夫妻插入该条文档命令时,因网络拥堵原因,超过5秒未完成命令,该命令将放弃执行,并返回一个出错对象。
简化的插入命令
从3.2版本开始,MongoDb支持两种新的文档插入命令:
- 一次插入一条数据:
db.collection.insertOne()
- 一次插入多条数据:
db.collection.insertMany()
向数组中添加元素
如果数组已经存在,"$push"会向已有数组末尾加入一个元素
使用"$each"子操作符,可以通过一次"$push"操作添加多个值:
如果希望数组的最大长度是固定的,那么可以将"$slice"和"$push"组合在一起使用,这样就可以保证数组不会超出指定的最大长度:
数组只包含最后加入的10个元素。"$slice"的值必须是负整数。
可以在清理元素之前使用"$sort",只要向数组中添加子对象就需要清理:
db.movies.update(
{"genre":"horror"},
{
"$push":{
"$each":[
{"name": "Nightmare on Elm Street", "rating": 6.6},
{"name": "Saw", "rating" :4.3}
],
"$slice": -10,
"$sort": {"rating": -1}
}
}
)
这样会根据"rating"字段的值对数组中所有对象进行排序,然后保留前10个。
注意:不能只将"$slice"或者"$sort"与"$push"配置使用,且必须使用"$each"。
将数组作为数据集使用
将数组作为数据集使用,保证数组内的元素不会重复,可以用"$ne"
来实现
也可以使用$addToSet
来实现:
$addToSet
和$push
组合起来可以实现添加多个不同的值: