首先了解一下MongoDB中存储数据的一些概念
对于数据路的操作无外乎对表的,集合的操作和对数据的操作。在python中进行下面的所有的操作前,都必须有这几条语句:
import pymongo
#与mongodb服务器进行连接
client = pymongo.MongoClient('localhost', 27017)
ceshi = client['ceshi'] #创建一个名为ceshi的数据库
#若直接连接已有的数据库,类似db = connection["ganji"]
item_info = ceshi['item_info']#建名为item_info的集合(表),同建立数据库形式一样
1 _id
MongoDB中存储的文档必须有一个”_id”键。这个键的值可以是任何类型的,默认是一个Objectld对象。在一个集合里面,每一个集合都有唯一的”_id”值,来确保集合里面每一个文档都被唯一的标识,如果有两个集合的话,两个集合可以都有一个值为”123”的”_id”的键,但是每一个集合只能有一个”_id”是123的文档。
2 插入、删除、更新记录(文档)
(1)对建好的集合中插入数据,用insert(),insert_one()函数
users.insert_one({"url":item_link})#一般要表前加上数据库的名字
ceshi.users.insert_one({"url":item_link})
(2)删除集合中的文档,用remove()函数,删除后的文档无法恢复
ceshi.user.remove() 表示删除集合里的所有记录
ceshi.user.remove({'yy':5}) #表删除yy=5的记录
id = ceshi.users.find_one({"name":"user1"})["_id"]
ceshi.users.remove(id)#找到name=user1的记录,并根据记录的id删除该记录
(3)更新记录用update()函数
db.collection.update( criteria, objNew, upsert, multi )
criteria: 需要被更新的条件表达式(update的查询条件,类似sql update查询内的where后面的)
objNew: 更新表达式(update的对象和一些更新的操作符(如$,$set..)等
upsert: 如目标记录不存在,是否插入新文档(默认为false,不插入)
multi: 是否更新多个文档(默认为false,只更新找到的第一条记录,若为ture,就把按条件查出来的多条记录全部更新)
ceshi.users.update({'gid':last_gid, 'time':l_date}, {'$set':{'gid':last_gid}, '$set':{'time':l_date}, '$addToSet':{'categories':category_data}}, upsert=True)
#上式表示添加'categories'字段到gid=last_gid,time=l_date的这条记录中。
3 数据的查询(重点)
基本上用find()函数进行查询,$lt/$lte/$gt/$gte/$ne,依次等价于< / <= / > / >=/ !=。(l表示less g表示greater e表示equal n表示not )
(1)查询显示符合条件的记录
#查询age小于15的
for u in ceshi.users.find({"age:{"$lt":15}):print u
# 查询 name 等于 user8 的
for u in ceshi.users.find({"name":"user8"}): print u
#获取查询的一个记录(注意用find_one()而不是find())
u2 = ceshi.users.find_one({"name":"user9"}) # 查不到时返回 None
print u2
(2)多条件进行查询
# select * from users where name = 'user3' and age > 12 and age < 15
for u in db.users.find({'age': {'$gt': 12, '$lt': 15}, 'name': 'user3'}): print u
# select * from users where name = 'user1' and age = 21
for u in db.users.find({"age":21, "name":"user1"}): print u
*记住,使用find()函数时,对应的条件都是以字典的形式表示{'age':{'$gt':12},'xx':'xx'},有多个条件时,都放在一个{}内
(3)计数,用count()函数
# select count(*) from users 查询users表中所有的记录的个数
print(db.users.find().count())
# select count(*) from users where age > 30 查询users表中age>30的记录
print(db.users.find({"age":{"$gt":30}}).count())
(4)从第几行开始读取(SLICE),读取多少行(LIMIT)
#从第2行开始读取,读取3行记录
for u in db.users.find().skip(2).limit(3): print u
4 导入json格式数据到Mongodb中
首先运行 mongo shell在数据库中创建一个 collection —— db.createCollection(‘the_name’)
接下来直接在终端/命令行中使用命令导入 json 格式的数据 —— mongoimport -d database_name -c collection_name F:\sample.json
以管理员权限用cd命令进入MongoDB安装目录中bin目录下,运行如下命令:
F:MongoDB>bin> mongoimport -d 数据库名字 -c 集合名字 –type 文件类型 –file 文件路径 –upsert
其中,–upsert字段的意思是以插入(insert)或者更新(update)的方式来导入数据
F:\MongoDB\bin>mongoimport -d ceshi -c item_infoX --type json --file F:\sample.json --upsert
2016-10-06T14:55:27.643+0800 connected to: localhost
2016-10-06T14:55:30.641+0800 [#####...................] ceshi.item_infoX 7.56MB/34.2MB (22.1%)
2016-10-06T14:55:33.639+0800 [##########..............] ceshi.item_infoX 15.3MB/34.2MB (44.9%)
2016-10-06T14:55:36.639+0800 [################........] ceshi.item_infoX 23.3MB/34.2MB (68.1%)
2016-10-06T14:55:39.640+0800 [#####################...] ceshi.item_infoX 31.3MB/34.2MB (91.5%)
2016-10-06T14:55:40.761+0800 [########################] ceshi.item_infoX 34.2MB/34.2MB (100.0%)
2016-10-06T14:55:40.762+0800 imported 86850 documents