创建、更新和删除文档
插入并保存文档insert
插入数据时,mongodb会对数据进行基本的检查,如果没有_id字段自动增加一个。所有的文档必须小于16M(可以设定)
> db.stu.insert({sn:"001",name:"xiaoming"});
WriteResult({ "nInserted" : 1 })
> db.stu.find();
{ "_id" : ObjectId("58a852e4dd917e60d8c0af7d"), "sn" : "001", "name" : "xiaoming" }
注意:mongodb只进行基本的检查,所以插入非法数据很容易,所以,应该只允许信任的源连接数据库。
可以自动指定ID
db.stu.insert({"_id":2,"sn":"name","name":"xiongang"});
> db.stu.insert([{"name":"lin"},{"age":89}]);
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
> db.stu.find();
{ "_id" : ObjectId("58a852e4dd917e60d8c0af7d"), "sn" : "001", "name" : "xiaoming" }
{ "_id" : 0 }
{ "_id" : 2 }
{ "_id" : ObjectId("58a8541bdd917e60d8c0af7e"), "name" : "lin" }
{ "_id" : ObjectId("58a8541bdd917e60d8c0af7f"), "age" : 89 }
>
删除文档remove
remove(查询文档的可选参数,选项),选项是true表示删除一行,false表示删除所有匹配条件
不加条件会报错
> db.stu.remove();
2017-02-18T06:05:31.124-0800 E QUERY [thread1] Error: remove needs a query :
删除文档会很快,如果是清空整个集合,使用drop删除集合会更快;
> db.stu.remove({"_id":0});
WriteResult({ "nRemoved" : 1 })
> db.stu.find();
{ "_id" : ObjectId("58a852e4dd917e60d8c0af7d"), "sn" : "001", "name" : "xiaoming" }
{ "_id" : 2 }
{ "_id" : ObjectId("58a8541bdd917e60d8c0af7e"), "name" : "lin" }
{ "_id" : ObjectId("58a8541bdd917e60d8c0af7f"), "age" : 89 }
>
如果某个数据库上没有了表那么它这个数据库也会自动删除,mongodb数据库是基于表的。
> db.stu.drop();
true
> show dbs;
admin 0.000GB
local 0.000GB
更新文档update
update(查询文档,修改器文档)
查询到某个匹配数据行,然后进行行更新
更新操作是不可分割的,若是两个更新同时发生,先到达服务器的先执行,接着执行另外一个。
> db.stu.findOne()
{
"_id" : ObjectId("58a852e4dd917e60d8c0af7d"),
"sn" : "001",
"name" : "xiaoming"
}
> db.stu.update({"sn":"001"}, {"name":"linjunbin",age:"30"});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.stu.findOne();
{
"_id" : ObjectId("58a852e4dd917e60d8c0af7d"),
"name" : "linjunbin",
"age" : "30"
}
>
mongodb会查出当前一个匹配的文档,进行更新,没办法把所有的条件进行匹配更新。
默认:mongodb更新默认只更新一行,如果要更新多行需要使用Multi。
> db.person.find();
{ "_id" : ObjectId("58ea1b275d2339dfb50aa5ac"), "name" : "lin" }
{ "_id" : ObjectId("58ea1b4b5d2339dfb50aa5ad"), "name" : "lin" }
{ "_id" : ObjectId("58ea1b545d2339dfb50aa5ae"), "name" : "lin" }
> db.person.update({name:'lin'},{name:'linjunbin',age:20});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find()
{ "_id" : ObjectId("58ea1b275d2339dfb50aa5ac"), "name" : "linjunbin", "age" : 20 }
{ "_id" : ObjectId("58ea1b4b5d2339dfb50aa5ad"), "name" : "lin" }
{ "_id" : ObjectId("58ea1b545d2339dfb50aa5ae"), "name" : "lin" }
multi:true表示修改多行
> db.person.update({name:'lin'},{"$set":{sex:'gener'}},{multi:true});
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
> db.person.find({name:'lin'});
{ "_id" : ObjectId("58ea1b4b5d2339dfb50aa5ad"), "age" : 30, "name" : "lin", "sex" : "gener" }
{ "_id" : ObjectId("58ea1b545d2339dfb50aa5ae"), "name" : "lin", "sex" : "gener" }
使用修改器
$inc:新增数据,该键不存在就创建。整型、长整型、双精度浮点型。
> db.person.update({name:'linjunbin'},{"$inc":{"age":99}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find({name:'linjunbin'});
{ "_id" : ObjectId("58ea1b275d2339dfb50aa5ac"), "name" : "linjunbin", "age" : 119 }
> db.person.update({name:'linjunbin'},{"$inc":{"age":9.9}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find({name:'linjunbin'});
{ "_id" : ObjectId("58ea1b275d2339dfb50aa5ac"), "name" : "linjunbin", "age" : 128.9 }
$set:指定一个字段的值,如果字段不存在就创建它。可以修改内嵌文档。
> db.person.update({name:'lin'},{"$set":{"age":30}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find();
{ "_id" : ObjectId("58ea1b275d2339dfb50aa5ac"), "name" : "linjunbin", "age" : 20 }
{ "_id" : ObjectId("58ea1b4b5d2339dfb50aa5ad"), "name" : "lin", "age" : 30 }
$unset:删除某个指定的字段;
> db.person.update({name:'lin'},{"$unset":{name:1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find()
{ "_id" : ObjectId("58ea1b275d2339dfb50aa5ac"), "name" : "linjunbin", "age" : 20 }
{ "_id" : ObjectId("58ea1b4b5d2339dfb50aa5ad"), "age" : 30 }
{ "_id" : ObjectId("58ea1b545d2339dfb50aa5ae"), "name" : "lin" }
$rename表示重命名。
> db.person.update({age:30},{"$rename":{name:'rename'}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find({age:30});
{ "_id" : ObjectId("58ea1b4b5d2339dfb50aa5ad"), "age" : 30, "sex" : "gener", "rename" : "lin" }
option的作用:{upsert:true},表示如果有查找到数据就匹配修改,如果没有就直接创建。
> db.person.update({age:40},{name:'lin',sex:'gener'},{upsert:true});
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("58ea2143934566b39ed6a808")
})
数组修改器
$push:向已经有的数组末尾加入一个元素。如果没有就创建一个新的数组。
> db.person.update({name:"lin"},{"$push":{"comments":{title:"this is title",age:30}}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find({name:'lin'});
{ "_id" : ObjectId("58ea1b545d2339dfb50aa5ae"), "name" : "lin", "sex" : "gener", "comments" : [ { "title" : "text", "com" : "tt" }, { "title" : "txt", "com" : "txdd" }, { "title" : "this is title", "age" : 30 } ] }
{ "_id" : ObjectId("58ea2143934566b39ed6a808"), "name" : "lin", "sex" : "gener", "comments" : [ { "title" : "text", "com" : "tt" }, { "title" : "txt", "com" : "txdd" } ] }
each:通过一次 push操作添加多个值。
> db.person.find({name:'linjunbin'});
{ "_id" : ObjectId("58ea1b275d2339dfb50aa5ac"), "name" : "linjunbin", "age" : 128.9, "hourly" : [ "football", "basketball" ] }
> db.person.update({name:'linjunbin'},{"$push":{hourly:{"$each":['football2','basketball2']}}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find({name:'linjunbin'});
{ "_id" : ObjectId("58ea1b275d2339dfb50aa5ac"), "name" : "linjunbin", "age" : 128.9, "hourly" : [ "football", "basketball", "football2", "basketball2" ] }