首先推荐一个很好用的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,则只更新第一条记录。