MongoDB常用基本操作
一、基础
MongoDB不需要像关系型数据库那样需要显式创建数据库,可以直接使用use语句创建:
> use foo
将文档插入集合中使用insert方法:
> db.blog.insert(post)
查找使用find或者findOne方法:
> db.blog.find() > db.blog.findOne()
更新使用update方法,接受两个参数。第一个参数用于定位,第二个参数传递更新后的文档。在此之前需要用var方法取出原纪录:
> var updatedpost = db.blog.findOne({'title':'Post'}) > updatedpost.content = 'New Content' > db.blog.update({'title': 'Post'}, updatedpost)
删除使用remove方法:
> db.blog.remove({'title':'Post'})
二、创建、更新和删除
1. 批量创建:
> db.batchInsert([{'a':1}, {'a':2}, {'a':3}])
2. 修改器
$inc:数值增加
> db.data.update({'_id':1}, {'$inc':{'times':1}})
$set:指定字段值
> db.data.update({'_id':1}, {'$set':{'title':'new title'}})
$unset:删除字段
> db.data.update({'_id:1'}, {'$unset': {'title':1}})
$push:添加字段,将新字段的值保存为数组添加到文档中
> db.data.update({'_id:1'}, {'$push': {'comments':'comment1'}})
$addToSet和$each组合:添加多个不同的值,如果已存在就不再添加
> db.data.update({'_id':1}, {'$addToSet': {'email': {'$each': ['123@a.com', '123@b.com', '123@c.com']}}})
$pull:删除特定元素,仅当key的值为数组时可用,删除数组中值为value的元素
> db.blog.update({}, {'$pull':{'key':'value'}})
$定位符:用于定位符合要求的文档并进行修改。这里$用于替代已查找出的comment的数组中John所在的位置,并用$set进行更新
> db.blog.update({'comment.author':'John'}, {'$set': {'comment.$.author':'Jack'}})
3. 使用upsert
upsert可以对于不存在的元素进行创建,对于已存在的元素不操作。在update中位于第三个参数,将其改为true。
> db.collection.update({'key':3}, {'$inc':{'key':1}}, true)
如果集合中存在一条key为3的文档,该操作会将key为3的值改为4;如果不存在,则会创建一条key为4的文档。另外,如果再次执行该操作,会再次生成一条key为4的文档。
4.更新多条文档
update方法的第4个参数控制是否更新多条符合条件的记录。设定为true,则会更新多条匹配的记录;设定为false,则只更新一条匹配的记录。
三、查找
查找使用find或者findOne(找出一条记录)。如果希望只返回特定的几个字段,则可如下操作:
> db.blog.find({}, {'username': 1, 'post': 1})
这样在输出中就会只包含username和post字段。然而,_id字段是默认返回的,需要在find的参数中手动指定为0才能不返回。
1.比较操作符
$lt, $gt, $lte, $gte, $ne分别对应<、>、<=、>=、!= 五个比较操作符,可以如下操作:
> db.collection.find({'score': {'$gte': 60, '$lte': 70}})
这样可以找出分数在60到70之间的记录。
2.$or、$in
$or用于选择判断条件,满足一条即可。$in用于值选择,判断值是否在数组之内。
> db.collection.find({'number': {'$in': [1, 2, 3]}}) > db.collection.find({'$or': [{'number': 1}, {'age': 20}]})
类似的,还有$nin、$not和$and。
3.$exists
$exists用来判断字段是否存在。true为存在,false为不存在。下面操作用来寻找值为null的记录:
> db.collection.find({'key': {'$in' : [null], '$exists': true}})
没有等于操作符,所以这里用in代替。如果不加上后面的exists操作符,则会返回所有值为null以及key字段不存在的记录。
4.数组查找
用$all通过多个元素查找数组匹配。以下操作会找出key的值包含value1和value2的数组。
> db.collection.find({'key': {'$all': ['value1', 'value2']}})
如果不加$all,则变成了精确匹配。如果想要通过位置寻找元素,则需要在key中添加下标。
> db.collection.find({'key.0': 'value1'})
此外,用$size可以查询数组长度。
> db.collection.find({'key': {'$size': 3}})
用$slice可以查询数组的部分元素。下面的操作返回数组中从5号开始的5个元素。
> db.collection.find({'author':'John'}, {'comment': {'$slice': [5, 5]}})
5.查询内嵌文档
用$elemMatch匹配文档中部分元素。下面的操作用于找出作者为John的5分评论,如果不加上elemMatch,则如果文档中还有其他的键值对,则不能匹配。
> db.post.find({'comment': {'$elemMatch': {'author': 'John', 'score': 5}}})
6.结果处理
$limit限值结果数量,$skip跳过部分结果,$sort对结果排序。
> db.collection.limit(3) > db.collection.skip(3) > db.collection.sort({'_id': 1, 'key': -1})