假设目前有data数据表,数据结构如下所示:
id | name | age | gender |
---|---|---|---|
0001 | 张超 | 18 | 男 |
0002 | 张猛 | 20 | 男 |
0003 | 李丽 | 19 | 女 |
0004 | 王超凡 | 21 | 男 |
0005 | 吴桐 | 21 | 女 |
mongoDB的查找操作
1.find_one
(1)查找一条数据,例如查找id为0001号的同学,语句为:
db.getCollection('data').find_one({"id":"0001"})
返回结果即,_id是存储对象的唯一标识,为mongo默认存储:
{
"_id" : ObjectId("5b729f91ff98a9c886ea401c"),
"id" : "0001",
"name" : "张超",
"age" : 18,
"gender":"男"
}
(2)根据范围查找,例如查找年龄大于20岁的同学,语句为,值得注意的是利用find_one函数仅仅返回一个结果,如若想查找全部结果,请使用find函数,使用方法与find_one类似,如果利用python,返回结果是一个cursor对象,可以遍历该对象查找所有结果:
db.getCollection('data').find_one({"age":{"$gt":20}})
返回结果即:
{
"_id" : ObjectId("5b729f91ff98a9c886ea402b"),
"id" : "0004",
"name" : "王超凡",
"age" : 21,
"gender":"男"
}
gt为大于,gte大于等于,lt为小于,lte为小于等于,ne为不等于,上述范围查找亦可用于字符串形式。范围查找可用“,”隔开,如大于10,小于20,即:{"$gt":10,"$lt":20}
(3)模糊匹配,例如查找姓“李”的同学,查询语句如下:
db.getCollection('data').find_one({"name":{"$regex":"李"}})
返回结果即:
{
"_id" : ObjectId("5b729f91ff98a9c886ea4031"),
"id" : "0003",
"name" : "李丽",
"age" : 19,
"gender":"女"
}
(4)两个字段的查询,例如查找21岁的女性同学,查询条件用“,”隔开,如下:
db.getCollection('data').find_one({"age":21,"gender":"女"})
返回结果即:
{
"_id" : ObjectId("5b729f91ff98a9c886ea4024"),
"id" : "0005",
"name" : "吴桐",
"age" : 21,
"gender":"女"
}
2.find
使用方法和find_one类似,返回结果需遍历查找。在mongo的客户端会全部显示,推荐一个好用的mongoDB客户端,操作直观且简洁Robo 3T客户端
mongoDB的排序操作
1.sort
sort函数是排序函数,参数如为1,升序,参数为-1,降序,一般应用为查找到的数据进行排序,例如男性同学按年龄降序,语句为:
db.getCollection('data').find({"gender":"男"}).sort({"age":-1})
返回结果即:
{
"_id" : ObjectId("5b729f91ff98a9c886ea402b"),
"id" : "0004",
"name" : "王超凡",
"age" : 21,
"gender":"男"
}
{
"_id" : ObjectId("5d8e1b0eff98a9c886e3fd6f"),
"id" : "0002",
"name" : "张猛",
"age" : 20,
"gender":"男"
}
{
"_id" : ObjectId("5b729f91ff98a9c886ea401c"),
"id" : "0001",
"name" : "张超",
"age" : 18,
"gender":"男"
}
使用python操作mongoDB时需要注意sort函数的写法,和客户端略有不同:
find({"name": "**"}).sort([("age", -1)]).limit(5)
这里再提一个会常用到的函数即limit,可以限制返回的结果个数,在上述语句的后面加.limit(1)就会只返回第一个结果。
mongoDB的插入操作
1.insert
insert方法较为简单,直接将一个dict类型的数据插入就可以。例如插入
student = {"id" : "0006","name" : "徐凤年","age" : 18,"gender":"男"}
语句为:
db.getCollection('data').insert(student)
2.insert_one,insert_many的用法类似,这里不再赘述
mongoDB的更新操作
1.update_one
更新一条数据,
db.getCollection('data').update_one(
<query>,
<update>,
{
upsert: <boolean>,
}
)
- query : update的查询条件,和find类似
- update : update的对象,和insert类似
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
例如将“张超”同学年龄改完22岁,语句为:
db.getCollection('data').update_one({'name':'张超'},{"$set":{'age':'22'}})
2.update用法类似,多了参数,即(1)multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。(2)writeConcern :可选,抛出异常的级别。
mongoDB的删除操作
1.remove
db.getCollection('data').remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
- query :(可选)删除的文档的条件,用法和find类似
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别。
mongo的进阶
记录自己使用过的一些复杂操作,便于查找和复现使用:
1.批量修改字段的名称
语句为:
db.getCollection('data').find({"gender":"男"}).forEach(function(item){db.getCollection('data').update({"_id":item._id},{$set:{"gender":"男性"}})})
该语句会将库中所有的性别是男的数据改为性别是男性
第一次写博客,利用mongo整理训练语料,记录一些常用操作和小坑,如有错误请大家指出,避免误人子弟。