1、简介

MongoDB是一种强大、灵活、追求性能、易扩展的数据存储方式。是面向文档的数据库,不是关系型数据库,是NoSQL(not only SQL)的一种。所谓的面向文档,就是将原来关系型数据库中的“行”的概念换成了更加灵活的"文档",以文档为存储单位。文档的值可以是数组、文档等复杂的数据模型。并且文档的键不会事先定义也不会固定不变。mongoDB设计的主要思想之一就是,将能交给客户端的操作都要从服务端转移到客户端。

文档

文档是MongoDB的核心、基本数据单元,类似于JS中的JSON对象,由多个key-value构成,但是支持更多的数据类型。多个键以及相关的值有序的放置在一起便是文档。在大多数编程语言中都是使用多个key-value的形式,Java中是map,Python中是字典,JavaScript中是对象。

文档中的key/value是有序的,没有相同的两个文档。
文档中的value的数据类型没有限制,甚至可以是文档。
文档的key一般应该是字符串。
文档的key不能含有空字符串,不能含有.和$以及_。
文档的key不能重复。
mangoDB中,key和value都是区分数据类型和大小写的。

集合

集合就是一组文档,如果说文档类似于关系数据库中的行,那么集合就是表。集合是无模式的(模式的概念参见模式的意义)。一个集合中的文档可以是任意类型的,也就是说文档是可以任意组合的。

和key一样不能有空字符串
不能以"system."开头,不能含有"$"
一个集合的完全限定名:数据库名.集合(子集合)名称,例如cms.blog.posts

数据库

MangoDB中最基本的存储单元是文档,文档组成集合,集合组成数据库。一个MangoDB实例可以承载多个数据库,数据库之间完全独立。一般情况下,一个应用对应一个数据库,类似于关系数据库中的外模式。

不能是空字符串
不得含有空格、点、斜杠与反斜杠以及空字符串。
应该全部小写
最多64字节

查看mongodb版本信息 mongod -v

配置文件参数说明:

mongodb的参数说明:

--dbpath 数据库路径(数据文件)

--logpath 日志文件路径
--master 指定为主机器
--slave 指定为从机器
--source 指定主机器的IP地址
--pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。
--logappend 日志文件末尾添加
--port 启用端口号
--fork 在后台运行
--only 指定只复制哪一个数据库
--slavedelay 指从复制检测的时间间隔
--auth 是否需要验证权限登录(用户名和密码)

注:mongodb配置文件里面的参数很多,定制特定的需求,请参考官方文档

配置文件内容:

dbpath=/data/mongodb
logpath=/data/mongodb/log/mongodb.log
logappend=true
port=27017
fork=true
##auth = true # 先关闭, 创建好用户在启动

2、安装与使用

1、安装

pip install pymongo

2、使用

2.1 连接

(1) 导入

from pymongo import MongoClient

(2) 连接mongodb

host = localhost
port = 27017

client = MongoClient(host,port)

(3) 连接数据库

db = client.test_database

or 

db = client[test_database]

注:当连接的数据库设置了auth之后,需要这样连接,不同版本,不同平台都不一样,具体见官方文档

client[test_database].authenticate("user","passwd",mechanism="SCRAM-SHA-1")

(4) 连接数据库中的某个集合

## 获取该数据库中的非系统集合
db.collection_names(include_system_collections=False)

## 连接集合
collection = db[collection_name]
or
collection = db.collection_name

2.2 增删改查

很好的一点就是,数据库不需要先建立,在连接后,如果进行插入数据操作,系统可以自己创建,上面提到过,mongodb的数据,使用的是类似json风格的文档,在python中即为字典,形如下例:

     insert_data = {
     "author": "Mike",
     "text": "My first blog post!",
     "tags": ["mongodb", "python", "pymongo"],
     "date": datetime.datetime.utcnow()
      }
collection = db[collection_name]

(1)增

在插入一个文档时,MongoDB会自动给每个文档增加一个”_id”的键,这个键是通过复杂计算出来的,不会重复,类似于下面这样的:

ObjectId('4ea02dfdd483050fe8000001')

那么如何利用ObjectId查询,这里有一个坑

>>> import pymongo
>>> import time
>>> db = pymongo.Connection("192.168.xx.xx",27017).linuxyan
>>> posts = db.posts
>>> post = {",
...         "author": "Mike",
...         "text": "My first blog post!",
...         "tags": ["mongodb", "python", "pymongo"],
...         "date": time.strftime('%Y-%m-%d %H:%M:%S')}
>>> posts.insert(post)
ObjectId('53bd5a5fe138235f74b67563')

#//插入数据成功
#//利用{'author':'Mike'} 测试查询正常
>>> posts.find_one({'author':'Mike'})
{u'_id': ObjectId('53bd5a5fe138235f74b67563'), u'author': u'Mike',....}

#//利用{'_id':"ObjectId('53bd5a5fe138235f74b67563')"}查询为空
>>>posts.find_one({'_id':"ObjectId('53bd5a5fe138235f74b67563')"})   

#//如何利用ObjectId来查询?
>>> from bson import ObjectId
>>> posts.find_one({'_id':ObjectId('53bd5a5fe138235f74b67563')})
{ u'_id': ObjectId('53bd5a5fe138235f74b67563'), u'author': u'Mike',....}
#//原来ObjectId是一个对象,而不是一个字符串,此时我只能"呵呵",折腾两个多小时。

增加数据不需要事先定义文档的机构,每个文档的结构也可以不一样

单条插入

result = collection.insert_one(insert_data)

多条插入

result = collection.insert_many(insert_datas)

返回插入id

result.insert_id [单]
result.insert_ids [多]

(2)查

无条件查询

collection.find_one() [单]
collection.find() [多]

条件查询

collection.find({"author": "Mike"})
collection.find_one({"author": "Mike"})
cursor = collection.find({
"}]
}
)  

[仅显示cuisine为Italian和address.zipcode为10075的数据。两个条件只要满足一个就可以]

区间查询

d = datetime.datetime(2009, 11, 12, 12)
for post in collection.find({"date": {"$lt": d}}).sort("author"):
    print post
 $lt 小于

文档记录数

collection.count()

数据排序

调用 pymongo.ASCENDING()和pymongo.DESCENDING()来指定是按升降序进行排序

cursor = collection.find().sort([
    ("borough", pymongo.ASCENDING),
    ("address.zipcode", pymongo.ASCENDING)
])

从第几行开始读取(SLICE),读取多少行(LIMIT)

for u in collection.find().skip(2).limit(3):
    print u

IN

for u in db.users.find({"age":{"$in":(23, 26, 32)}}): print u
for u in db.users.find({"age":{"$nin":(23, 26, 32)}}): print u

是否存在

db.users.find({'sex':{'$exists':True}})  # select * from 集合名 where exists 键1
db.users.find({'sex':{'$exists':False}}) # select * from 集合名 where not exists 键1

正则表达式查询

for u in db.users.find({"name" : {"$regex" : r"(?i)user[135]"}}, ["name"]): print u # 查询出 name 为 user1, user3, user5 的
多级路径的元素值匹配

Document 采取 JSON-like 这种层级结构,因此我们可以直接用嵌入(Embed)代替传统关系型数据库的关联引用(Reference)。
    MongoDB 支持以 "." 分割的 namespace 路径,条件表达式中的多级路径须用引号

# 条件表达式中的多级路径须用引号,以 "." 分割
    u = 集合名.find_one({"im.qq":12345678})
    # 查询结果如:{"_id" : ObjectId("4c479885089df9b53474170a"), "name" : "user1", "im" : {"msn" : "user1@hotmail.com", "qq" : 12345678}}

(3)改

origin_data = {"title":"Python and MongoDB",
     "slug":"python-mongodb",
     "author":"SErHo",
     "content":"Python and MongoDB....",
     "tags":["Python","MongoDB"],
     "time":datetime.datetime.now()}
>>> post = posts.find_one({"slug":"python-mongodb"})
>>> post["author"]
u'SErHo'
>>> post["author"] = "HaHa Lu"
>>> post["title"] = "Test Update"
>>> post["title"] = "Test Update"
>>> post["_id"]
ObjectId('4ea0207dd483050fe8000001')
>>> posts.update({"_id":post["_id"]},post)
>>> post = posts.find_one({"_id":post["_id"]})
>>> print post
{u'author': u'HaHa Lu', u'title': u'Test Update',
 u'tags': [u'Python', u'MongoDB'],
 u'content': u'Python and MongoDB....',
 u'time': datetime.datetime(2011, 10, 20, 21, 21, 52, 818000),
 u'_id': ObjectId('4ea0207dd483050fe8000001'),
 u'slug': u'python-mongodb'}

首先我们根据slug来获得一篇文章,然后可以通过Python字典访问方法得到键的值,然后重新设置,再对post集合进行更新,在对整个集合进行更新时,你得先匹配要更改的文档,利用_id这个属性来更新是比较常用的方法,因为你其他改了,这个可改不了。在执行update中最常见的错误就是限制的条件找到了多个文档,如果这样,数据库就不会更新这个集合,所有最好使用_id来匹配。

如果只更新一个键呢,那就不用这么大费周折了,可以使用”$set”这个修改器,指定一个键,如果不存在,就可以创建。比如我要继续更新上面那篇文章的content,可以这样做(记住,修改它,必须先找到它,这里我利用上面查询到的_id值来找):

>>> posts.update({"_id":post["_id"]},{"$set": {"content":"Test Update SET...."}})

MongoDB的修改是很强大的,你可以把数据类型也给改了,比如把tags的数组改成普通的字符串。”$set”过后又想删除这个键,可以使用”$unset”。如果我的这个post里面有一个键是views,即文章访问的次数,我想在每次访问这个文章后给它的值增加1,这该怎么办?于是”$inc”修改器出场了,这个可以用来增加已有键的值,如果没有,则创建它,类似的用法是:

>>> posts.update({"_id":post["_id"]},{"$inc":  {"views":1}})

如果想修改tags这个数组里面的内容怎么办?有一个办法就是用$set整体修改,但只是改里面的一些元素呢,MongoDB准备好了用于数组的修改器。比如,想要在tags里面加一个”Test”,这需要使用”$push”,它可以在数组末尾添加一个元素:

>>> posts.update({"_id":post["_id"]},{"$push":{"tags":"Test"}})

为了避免加入了重复的,可以将”$push”改为使用”$addToSet”,如果需要添加多个值,可以配合”$each”来使用,这样就可以添加不重复的进去,如下面:

>>> posts.update({"_id":post["_id"]},{"$addToSet": {"tags":{"$each":["Python","Each"]}}})

(4) 删

可以把数组看成栈和队列,使用”$pop”来操作,比如上面的:

>>> posts.update({"_id":post["_id"]},{"$pop":{"tags":1}})

这个会删除tags里面最后一个,改成-1则删除第一个。可以使用”$pull”来删除数组中指定的值,它会删除数组中所有匹配的值。如何修改其中的一个值呢?可以先删除掉,再增加一个进去,还有就是直接定位修改。比如tags数组中,”Python”是第一个,想把它改成”python”,可以通过下标直接选择,就是tags[0],然后使用上面的”$set”等修改器,如果不确定可以使用$来定位:

>>> posts.update({"tags":"MongoDB"},{"$set":{"tags.$":"Hello"}})

这个将先搜索tags中满足”MongoDB”的,如果找到,就把它修改为”Hello”。可以看到上面的update这个函数已经有两个参数了,它还有第3个参数upsert,如果设为”True”,则如果没有找到匹配的文档,就会在匹配的基础上新建一个文档

3、相关操作

 注:collection:user
 (1) $all: 判断数组属性是否包含全部条件。
     db.users.insert({'name':"user3", 'data':[1,2,3,4,5,6,7]})
     db.users.insert({'name':"user4", 'data':[1,2,3]})

     for u in db.users.find({'data':{'$all':[2,3,4]}}): print u
     # 显示: { "_id" : ObjectId("4c47a133b48cde79c6780df0"), "name" : "user3", "data" : [ 1, 2, 3, 4, 5, 6, 7 ] }
     注意和 $in 的区别。$in 是检查目标属性值是条件表达式中的一员,而 $all 则要求属性值包含全部条件元素。

   (2) $size: 匹配数组属性元素数量。
     for u in db.users.find({'data':{'$size':3}}): print u
     # 只显示匹配此数组数量的: { "_id" : ObjectId("4c47a13bb48cde79c6780df1"), "name" : "user4", "data" : [ 1, 2, 3 ] }

   (3) $type: 判断属性类型。
     for u in db.users.find({'t':{'$type':1}}): print u  # 查询数字类型的
     for u in db.users.find({'t':{'$type':2}}): print u  # 查询字符串类型的

     类型值:
         double:1
         string: 2
         object: 3
         array: 4
         binary data: 5
         object id: 7
         boolean: 8
         date: 9
         null: 10
         regular expression: 11
         javascript code: 13
         symbol: 14
         javascript code with scope: 15
         32-bit integer: 16
         timestamp: 17
         64-bit integer: 18
         min key: 255
         max key: 127

   (4) $not: 取反,表示返回条件不成立的文档。
     似乎只能跟正则和 $mod 一起使用????
     # 还不知如何使用

   (5) $unset: 和 $set 相反,表示移除文档属性。
     for u in db.users.find({'name':"user1"}): print u
     # 显示如: { "_id" : ObjectId("4c479885089df9b53474170a"), "name" : "user1", "age" : 15, "address" : [ "address1", "address2" ] }

     db.users.update({'name':"user1"}, {'$unset':{'address':1, 'age':1}})
     for u in db.users.find({'name':"user1"}): print u
     # 显示如: { "_id" : ObjectId("4c479885089df9b53474170a"), "name" : "user1" }

   (6) $push: 和 $ pushAll 都是向数组属性添加元素。# 好像两者没啥区别
     for u in db.users.find({'name':"user1"}): print u
     # 显示如: { "_id" : ObjectId("4c479885089df9b53474170a"), "age" : 15, "name" : "user1" }

     db.users.update({'name':"user1"}, {'$push':{'data':1}})
     for u in db.users.find({'name':"user1"}): print u
     # 显示如: { "_id" : ObjectId("4c479885089df9b53474170a"), "age" : 15, "data" : [ 1 ], "name" : "user1" }

     db.users.update({'name':"user1"}, {'$pushAll':{'data':[2,3,4,5]}})
     for u in db.users.find({'name':"user1"}): print u
     # 显示如: { "_id" : ObjectId("4c479885089df9b53474170a"), "age" : 15, "data" : [ 1, 2, 3, 4, 5 ], "name" : "user1" }

   (7) $addToSet: 和 $push 类似,不过仅在该元素不存在时才添加 (Set 表示不重复元素集合)。
     db.users.update({'name':"user2"}, {'$unset':{'data':1}})
     db.users.update({'name':"user2"}, {'$addToSet':{'data':1}})
     db.users.update({'name':"user2"}, {'$addToSet':{'data':1}})
     for u in db.users.find({'name':"user2"}): print u
     # 显示: { "_id" : ObjectId("4c479896089df9b53474170b"), "data" : [ 1 ], "name" : "user2" }

     db.users.update({'name':"user2"}, {'$push':{'data':1}})
     for u in db.users.find({'name':"user2"}): print u
     # 显示: { "_id" : ObjectId("4c479896089df9b53474170b"), "data" : [ 1, 1 ], "name" : "user2" }

     要添加多个元素,使用 $each。
     db.users.update({'name':"user2"}, {'$addToSet':{'data':{'$each':[1,2,3,4]}}})
     for u in db.users.find({'name':"user2"}): print u
     # 显示: {u'age': 12, u'_id': ObjectId('4c479896089df9b53474170b'), u'data': [1, 1, 2, 3, 4], u'name': u'user2'}
     # 貌似不会自动删除重复

   (8) $each 添加多个元素用。
     db.users.update({'name':"user2"}, {'$unset':{'data':1}})
     db.users.update({'name':"user2"}, {'$addToSet':{'data':1}})
     for u in db.users.find({'name':"user2"}): print u
     # 显示: { "_id" : ObjectId("4c479896089df9b53474170b"), "data" : [ 1 ], "name" : "user2" }

     db.users.update({'name':"user2"}, {'$addToSet':{'data':{'$each':[1,2,3,4]}}})
     for u in db.users.find({'name':"user2"}): print u
     # 显示: {u'age': 12, u'_id': ObjectId('4c479896089df9b53474170b'), u'data': [1, 2, 3, 4], u'name': u'user2'}

     db.users.update({'name':"user2"}, {'$addToSet':{'data':[1,2,3,4]}})
     for u in db.users.find({'name':"user2"}): print u
     # 显示: { "_id" : ObjectId("4c479896089df9b53474170b"), "data" : [ 1, 2, 3, 4, [ 1, 2, 3, 4 ] ], "name" : "user2" }

     db.users.update({'name':"user2"}, {'$unset':{'data':1}})
     db.users.update({'name':"user2"}, {'$addToSet':{'data':[1,2,3,4]}})
     for u in db.users.find({'name':"user2"}): print u
     # 显示: { "_id" : ObjectId("4c47a133b48cde79c6780df0"), "data" : [ [1, 2, 3, 4] ], "name" : "user2" }

   (9) $pop: 移除数组属性的元素(按数组下标移除),$pull 按值移除,$pullAll 移除所有符合提交的元素。
     db.users.update({'name':"user2"}, {'$unset':{'data':1}})
     db.users.update({'name':"user2"}, {'$addToSet':{'data':{'$each':[1, 2, 3, 4, 5, 6, 7, 2, 3 ]}}})
     for u in db.users.find({'name':"user2"}): print u
     # 显示: { "_id" : ObjectId("4c47a133b48cde79c6780df0"), "data" : [ 1, 2, 3, 4, 5, 6, 7, 2, 3 ], "name" : "user2" }

     db.users.update({'name':"user2"}, {'$pop':{'data':1}}) # 移除最后一个元素
     for u in db.users.find({'name':"user2"}): print u
     # 显示: { "_id" : ObjectId("4c47a133b48cde79c6780df0"), "data" : [ 1, 2, 3, 4, 5, 6, 7, 2 ], "name" : "user2" }

     db.users.update({'name':"user2"}, {'$pop':{'data':-1}}) # 移除第一个元素
     for u in db.users.find({'name':"user2"}): print u
     # 显示: { "_id" : ObjectId("4c47a133b48cde79c6780df0"), "data" : [ 2, 3, 4, 5, 6, 7, 2 ], "name" : "user2" }

     db.users.update({'name':"user2"}, {'$pull':{'data':2}}) # 移除全部 2
     for u in db.users.find({'name':"user2"}): print u
     # 显示: { "_id" : ObjectId("4c47a133b48cde79c6780df0"), "data" : [ 3, 4, 5, 6, 7 ], "name" : "user2" }

     db.users.update({'name':"user2"}, {'$pullAll':{'data':[3,5,6]}}) # 移除 3,5,6
     for u in db.users.find({'name':"user2"}): print u
     # 显示: { "_id" : ObjectId("4c47a133b48cde79c6780df0"), "data" : [ 4, 7 ], "name" : "user2" }

   (10) $where: 用 JS 代码来代替有些丑陋的 $lt、$gt。
     MongoDB 内置了 Javascript Engine (SpiderMonkey)。可直接使用 JS Expression,甚至使用 JS Function 写更复杂的 Code Block。

     db.users.remove() # 删除集合里的所有记录
     for i in range(10):
         db.users.insert({'name':"user" + str(i), 'age':i})
     for u in db.users.find(): print u
     # 显示如下:
     { "_id" : ObjectId("4c47b3372a9b2be866da226e"), "name" : "user0", "age" : 0 }
     { "_id" : ObjectId("4c47b3372a9b2be866da226f"), "name" : "user1", "age" : 1 }
     { "_id" : ObjectId("4c47b3372a9b2be866da2270"), "name" : "user2", "age" : 2 }
     { "_id" : ObjectId("4c47b3372a9b2be866da2271"), "name" : "user3", "age" : 3 }
     { "_id" : ObjectId("4c47b3372a9b2be866da2272"), "name" : "user4", "age" : 4 }
     { "_id" : ObjectId("4c47b3372a9b2be866da2273"), "name" : "user5", "age" : 5 }
     { "_id" : ObjectId("4c47b3372a9b2be866da2274"), "name" : "user6", "age" : 6 }
     { "_id" : ObjectId("4c47b3372a9b2be866da2275"), "name" : "user7", "age" : 7 }
     { "_id" : ObjectId("4c47b3372a9b2be866da2276"), "name" : "user8", "age" : 8 }
     { "_id" : ObjectId("4c47b3372a9b2be866da2277"), "name" : "user9", "age" : 9 }

     for u in db.users.find({"$where":"this.age > 7 || this.age < 3"}): print u
     # 显示如下:
     {u'age': 0.0, u'_id': ObjectId('4c47b3372a9b2be866da226e'), u'name': u'user0'}
     {u'age': 1.0, u'_id': ObjectId('4c47b3372a9b2be866da226f'), u'name': u'user1'}
     {u'age': 2.0, u'_id': ObjectId('4c47b3372a9b2be866da2270'), u'name': u'user2'}
     {u'age': 8.0, u'_id': ObjectId('4c47b3372a9b2be866da2276'), u'name': u'user8'}
     {u'age': 9.0, u'_id': ObjectId('4c47b3372a9b2be866da2277'), u'name': u'user9'}

     for u in db.users.find().where("this.age > 7 || this.age < 3"): print u
     # 显示如下:
     {u'age': 0.0, u'_id': ObjectId('4c47b3372a9b2be866da226e'), u'name': u'user0'}
     {u'age': 1.0, u'_id': ObjectId('4c47b3372a9b2be866da226f'), u'name': u'user1'}
     {u'age': 2.0, u'_id': ObjectId('4c47b3372a9b2be866da2270'), u'name': u'user2'}
     {u'age': 8.0, u'_id': ObjectId('4c47b3372a9b2be866da2276'), u'name': u'user8'}
     {u'age': 9.0, u'_id': ObjectId('4c47b3372a9b2be866da2277'), u'name': u'user9'}

     # 使用自定义的 function, javascript语法的
     for u in db.users.find().where("function() { return this.age > 7 || this.age < 3;}"): print u
     # 显示如下:
     {u'age': 0.0, u'_id': ObjectId('4c47b3372a9b2be866da226e'), u'name': u'user0'}
     {u'age': 1.0, u'_id': ObjectId('4c47b3372a9b2be866da226f'), u'name': u'user1'}
     {u'age': 2.0, u'_id': ObjectId('4c47b3372a9b2be866da2270'), u'name': u'user2'}
     {u'age': 8.0, u'_id': ObjectId('4c47b3372a9b2be866da2276'), u'name': u'user8'}
     {u'age': 9.0, u'_id': ObjectId('4c47b3372a9b2be866da2277'), u'name': u'user9'}

pymongo 学习总结的更多相关文章

  1. pymongo学习第1篇——增删改查

    参考文档: 1.https://docs.mongodb.org/getting-started/python/ 2.http://api.mongodb.org/python/current/api ...

  2. pymongo 学习

    查看一条记录,返回一条 dict 记录 db.Account.find_one({"UserName":"keyword"}) 查看某一列的一条记录(此时的1, ...

  3. MongoDB学习【四】—pymongo操作mongodb数据库

    一.pymongodb的安装 Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接. pip安装 pip 是一个通用的 Python 包管理工具, ...

  4. PyMongo下载及安装

    PyMongo最新版本下载地址: http://pypi.python.org/pypi/pymongo/#downloads PyMongo旧版本下载地址: http://pypi.python.o ...

  5. 【mongodb 学习一】环境搭建之 mac 下连接 mongodb 的UI 客户端

    记录下 mongodb 的学习 懒得自己达 mongodb 的服务器了 虽然一句命令就能搞定了 brew install mongodb 可是考虑到以后的应用还是放在网上的,就直接用现成的服务吧 下载 ...

  6. [转载]MongoDB学习 (四):创建、读取、更新、删除(CRUD)快速入门

    本文介绍数据库的4个基本操作:创建.读取.更新和删除(CRUD). 接下来的数据库操作演示,我们使用MongoDB自带简洁但功能强大的JavaScript shell,MongoDB shell是一个 ...

  7. Comprehensive learning path – Data Science in Python深入学习路径-使用python数据中学习

    http://blog.csdn.net/pipisorry/article/details/44245575 关于怎么学习python,并将python用于数据科学.数据分析.机器学习中的一篇非常好 ...

  8. Python 初学者 入门 应该学习 python 2 还是 python 3?

    许多刚入门 Python 的朋友都在纠结的的问题是:我应该选择学习 python2 还是 python3? 对此,咪博士的回答是:果断 Python3 ! 可是,还有许多小白朋友仍然犹豫:那为什么还是 ...

  9. python爬虫 | 一条高效的学习路径

    数据是创造和决策的原材料,高质量的数据都价值不菲.而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣.知乎:爬取优质答案,筛选出各话题下热门内容,探索用户的舆论导向. 淘宝 ...

随机推荐

  1. IT轮子系列(四)——使用Jquery+formdata对象 上传 文件

    前言 在MVC 中文件的上传,一般都采用控件: <h2>IT轮子四——文件上传</h2> <div> <input type="file" ...

  2. Maximum Subarray(最大子数组)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  3. Mybatis 系列7

    上篇系列6中 简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介绍mapper映射文件的配置. 这是mybatis的核心之一 一定要学好 在mapper文件中,以mapper作为根 ...

  4. 新导入的eclipse项目报错,找不到java包,找不到web.xml文件报错。

    新导入的项目可能会出现报错,特别是web项目.我这里提供一种解决方法: 1.右击项目,选择“属性” 2.选择 Resource->java build path->libraries 图中 ...

  5. React+ANTD项目使用后的一些关于生命周期比较实用的心得

    1. constructor() constructor(props){ super(props) this.state=({ }) } 一定先写super  可以接收从父组件传来的值 父组件往子组件 ...

  6. C# SqlBulkCopy数据批量入库

    准备条件:20万+数据 界面设计使用的WPF. 没有对比就没有伤害,以下是我两种方式导入数据案例. 运行 结果对比: 首先使用一般sql语句导入,因为时间原因,我就没有等待程序执行完,但是我记录了大约 ...

  7. Hype-v 共享文件办法

    Hype-v在Windows下跑Windows系统,其效率要远好于VMWare,唯一蛋疼的就是剪贴板不能复制文件.共享文件的方案就剩下以下几种: 远程访问 虚拟磁盘 挂载镜像 挂载镜像把每个文件都制作 ...

  8. python爬虫入门(三)XPATH和BeautifulSoup4

    XML和XPATH 用正则处理HTML文档很麻烦,我们可以先将 HTML文件 转换成 XML文档,然后用 XPath 查找 HTML 节点或元素. XML 指可扩展标记语言(EXtensible Ma ...

  9. unity3d学习路线

    自学游戏开发难不难?小编在这里告诉你:你首先要做的是选择一门开发语言,包括Basic,Pascal,C,C++,等等.也经常会有人争论对于初学者哪门语言更好.对于这一系列流行语言的讨论,我的建议是以C ...

  10. Unity3D学习(五):实现一个简单的视觉感知

    前言 在很多第一人称或者第三人称射击游戏的单人模式中,玩家的乐趣往往来源于和各式各样的AI敌人的战斗.而战斗的爆发很多时候是因为这些AI在"看见"玩家后就会立即做出反应,比如开火. ...