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

首先推荐一个很好用的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
}

update

“$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,则只更新第一条记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值