您的位置:首页 > 数据库 > Mongodb

MongoDB创建、更新和删除等指令

2018-01-08 15:56 288 查看
首先推荐一个很好用的MongoDB客户端:RoboMongo

可以去官网上下载:https://robomongo.org/download

MongoDB的一些基础语法:

创建库和集合

创建数据库testdb,直接使用选库命令,不存在则会新建:

> use testdb
switched to db newdb


创建collection集合,如创建 mycollection

> db.createCollection("mycollection")


另外,这里可以不创建集合,直接插入文档,集合将会自动创建,如:

> db.mycollection.insertOne({"name":"foobar"})


单条插入和批量插入

> db.mycollection.insertOne({"name":"foobar"})
{
"acknowledged" : true,
"insertedId" : ObjectId("5a52e3e287df659d59e547e5")
}


如果一次性多条插入,效率较高,可以使用 insertMany 方法:

> db.mycollection.insertMany([{"name":"foo1"},{"name":"foo2"},{"name":"foo3"}])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5a52efc087df659d59e547e6"),
ObjectId("5a52efc087df659d59e547e7"),
ObjectId("5a52efc087df659d59e547e8")
]
}


对于插入,insert 方法已不提倡使用,3.2版本以后的Mongo,类似 insertOne/insertMany , updateOne/updateMany , deleteOne/deleteMany , findOneAndDelete/findOneAndUpdate/findOneAndReplace 都最好使用这些方法。

删除

remove() 和 deleteMany() 不带查询条件时,均为删除集合所有文档,应注意数据安全。

> db.mycollection.remove({"status":"A"})


根据条件删除单条:

> db.mycollection.deleteOne({"name":"foo1"})
{
"acknowledged" : true,
"deletedCount" : 1.0
}


根据条件删除多条:

> db.mycollection.deleteMany({"status":"A"})
> db.mycollection.remove({"status":"A"})


更新

使用修改器

“$set”修改器

可以用来指定一个字段的值。如果字段不存在,则创建。

> db.mycollection.updateOne({"name":"foo"},{$set:{"age":18}})
{
"acknowledged" : true,
"matchedCount" : 1.0,
"modifiedCount" : 1.0
}




“$unset”修改器

> db.mycollection.updateOne({"name":"foo"},{$unset:{"age":1}})
{
"acknowledged" : true,
"matchedCount" : 1.0,
"modifiedCount" : 1.0
}


$unset 修改器后,字段的值赋值多少是无所谓的,最终都要删掉该key。

“$inc”修改器

$inc 修改器可以用来给数值字段增加或减少一定的值,要增加的键值必须为数字,即只能是整形,长整型或双精度浮点型的值。

> db.mycollection.updateOne({"name":"foo"},{$inc:{"age":10}})
{
"acknowledged" : true,
"matchedCount" : 1.0,
"modifiedCount" : 1.0
}


另外,如果需要增加值的键不存在时,将创建这个键,并将其值设置为增加量。

数组修改器

“$push”添加元素

如果数组已经存在,$push 会向已有数组末位添加一个元素,如果没有就创建一个新的数组。

例如对下边文档,content键数组后添加两个元素:

> db.mycollection.updateOne({"name":"foo"},{$push:{"content":"hello1"}})
> db.mycollection.updateOne({"name":"foo"},{$push:{"content":"hello2"}})
{
"_id" : ObjectId("5a52dd8e87df659d59e547de"),
"name" : "foo",
"content" : [
"hello1",
"hello2"
]
}


上边的也可以用 $each 来更简单的改写:

> db.mycollection.updateOne({"name":"foo"},{$push:{"content":{$each : ["hello3", "hello4"]}}})


$each 可以通过一次操作将一些新元素添加到数组。

另外还可以与 slice 及 sort 操作符搭配使用,

如 slice:-10

slice 会保证数组添加只保留不大于10的元素个数,如果元素个数大于10,只有最后的10个保留,可以以此构建队列。

sort 可以将数组中的对象进行排序,然后保留个数。

二者都必须和push配合使用,且必须使用each。

> db.mycollection.updateOne({"name":"foo"},
{$push:{"top5":{
$each : [{"name":"t5","rating":"91"}, {"name":"t6","rating":"90"}],
$slice: -5,
$sort:{"rating":-1}}}})

"top5" : [
{
"name" : "t2",
"rating" : "96"
},
{
"name" : "t3",
"rating" : "93"
},
{
"name" : "t4",
"rating" : "92"
},
{
"name" : "t5",
"rating" : "91"
},
{
"name" : "t6",
"rating" : "90"
}
]


“$addToSet”保证元素不重复

类似$push 的用法,可以和 each 一起使用。

删除元素

几个从数组中删除元素的方法。$pop 可以从头或尾删除元素。

> db.mycollection.updateOne({"name":"foo"},{$pop:{"content":1}}) #尾部删除1个元素
> db.mycollection.updateOne({"name":"foo"},{$pop:{"content":-1}}) #头部删除1个元素


另外可以使用 $pull 来删除元素

> db.mycollection.updateOne({"name":"foo"},{$pull:{"content":"hello2"}})


基于位置的数组修改

很多情况下,不预先查询就不知道修改的数组的下标,可使用定位操作符 $ ,用来定位查询文档已经匹配的数组元素并进行更新。

> db.mycollection.updateOne({"top5.name":"t2"},{$set:{"top5.$.name":"tt2"}})

"top5" : [
{
"name" : "tt2",
"rating" : "96"
},
{
"name" : "t3",
"rating" : "93"
},
{
"name" : "t4",
"rating" : "92"
},
{
"name" : "t5",
"rating" : "91"
},
{
"name" : "t6",
"rating" : "90"
}
]


update的两个参数

update({}, {$set:{}}, false, true)

参数有两个boolean参数,第一个false代表,如果没有查询到匹配条件的文档,不需要进行对应的插入,即如果为true,无则插入。第二个true代表,更新匹配条件的所有文档,如果为false,则只更新第一条记录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: