折腾:
【已解决】把本地的音频字幕等数据存储到远程服务器的MongoDB数据库中
期间,之前连接本地Mongo的gridfs时可以正常运行的代码:
mongoClient = MongoClient()
gridfsDb = mongoClient.gridfs
fsCollection = GridFS(gridfsDb)
logging.info("fsCollection=%s", fsCollection)
# logging.info("fsCollection.stats()=%s", fsCollection.stats())
logging.info("fsCollection.totalSize()=%s", fsCollection.totalSize())
结果换成去连接到远程的mongo中的gridfs时,竟然就报错了:
logging.info("fsCollection.totalSize()=%s", fsCollection.totalSize())
AttributeError: ‘GridFS’ object has no attribute ‘totalSize’
现在去连接远程:
mongoClient = MongoClient(
host="x.x.x.x",
port=27017,
username="username",
password="pwd"
)
看看效果:
代码中出错:
2018/04/02 12:00:54 LINE 175 INFO fsCollection=<gridfs.GridFS object at 0x10d704190>
Traceback (most recent call last):
File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", line 1668, in <module>
main()
File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", line 1662, in main
globals = debugger.run(setup[‘file’], None, None, is_module)
File "/Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py", line 1072, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "/Users/crifan/dev/dev_root/company/naturling/projects/mongodb/saveLocalData/pymongoTest.py", line 178, in <module>
logging.info("fsCollection.totalSize()=%s", fsCollection.totalSize())
AttributeError: ‘GridFS’ object has no attribute ‘totalSize’
class MongoClient(common.BaseObject):
HOST = "localhost"
PORT = 27017
# Define order to retrieve options from ClientOptions for __repr__.
# No host/port; these are retrieved from TopologySettings.
_constructor_args = (‘document_class’, ‘tz_aware’, ‘connect’)
def __init__(
self,
host=None,
port=None,
document_class=dict,
tz_aware=None,
connect=None,
**kwargs):
"""Client for a MongoDB instance, a replica set, or a set of mongoses.
好像没有username和password?
pymongo AttributeError GridFS object has no attribute totalSize
python – "AttributeError: ‘GridFS’ object has no attribute ‘find’" – Stack Overflow
python – Pymongo GridFS put Type/Attribute errors – Stack Overflow
难道是:
服务器上的MongoDB的3.2的版本 没有这个totalSize属性?
pymongo GridFS totalSize
但是看调试信息,貌似是连接上的:
然后去保存一个文件:
[root@naturling-general-01 nickjr.com]# mongofiles -d gridfs put "nickjr_detail.py" –local "/root/naturling_20180101/crawler/origin_data/nickjr.com/nickjr_detail.py"
2018-04-02T13:31:49.956+0800 connected to: localhost
added file: nickjr_detail.py
[root@naturling-general-01 nickjr.com]# mongo
MongoDB shell version: 3.2.19
connecting to: test
Server has startup warnings:
2018-04-02T11:07:09.596+0800 I CONTROL [initandlisten]
2018-04-02T11:07:09.596+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ‘always’.
2018-04-02T11:07:09.596+0800 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
2018-04-02T11:07:09.597+0800 I CONTROL [initandlisten]
2018-04-02T11:07:09.597+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is ‘always’.
2018-04-02T11:07:09.597+0800 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
2018-04-02T11:07:09.597+0800 I CONTROL [initandlisten]
2018-04-02T11:07:09.597+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 4096 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
2018-04-02T11:07:09.597+0800 I CONTROL [initandlisten]
> use gridfs
switched to db gridfs
> show collections
fs.chunks
fs.files
> db.fs.files.find().pretty()
{
"_id" : ObjectId("5ac1c04557511d060d5d6774"),
"chunkSize" : 261120,
"uploadDate" : ISODate("2018-04-02T05:31:49.958Z"),
"length" : 4884,
"md5" : "4c55ab6a0ecb398ffbe7819b37643c74",
"filename" : "nickjr_detail.py"
}
>
用于调试去删除时,是否能找到文件:
果然是可以找到并删除文件的:
-》gridfs中的其他操作:
find文件,delete文件 都是正常的
-》证明了:在线的MongoDB 3.2中的gridfs中是没有totalSize这个属性的
-〉再去找找api文档看看
db.collection.totalSize() — MongoDB Manual 3.6
-》
db.collection.totalSize() — MongoDB Manual 3.2
好像也是有的啊
怪了
mongo shell totalSize
db.collection.totalSize() – MongoDB shell method – w3resource
MongoDB – totalSize of a collection – Stack Overflow
[SERVER-16848] Shell’s db.collection.totalSize() returns NAN on latest – MongoDB
难道是因为:远程gridfs中没有任何文件?所以没法获取totalSize?所以报错?
去试了试,确保远程gridfs中有文件:
> use gridfs
switched to db gridfs
> db.fs.files.find().pretty()
{
"_id" : ObjectId("5ac1c20f57511d061ef265f7"),
"chunkSize" : 261120,
"uploadDate" : ISODate("2018-04-02T05:39:27.041Z"),
"length" : 4884,
"md5" : "4c55ab6a0ecb398ffbe7819b37643c74",
"filename" : "nickjr_detail.py"
}
>
但是结果错误依旧
换回本地mongo数据库,看看是否正常了
结果发现此处也不正常了:
logging.info("fsCollection.totalSize()=%s", fsCollection.totalSize())
AttributeError: ‘GridFS’ object has no attribute ‘totalSize’
错误一样的。
那为何之前代码可以正常运行?
去找找之前是怎么回事。
去看了之前的:
果然发现是之前就写了:
“然后去Python中的gridfs中去试试:
logging.info("fsCollection.stats()=%s", fsCollection.stats())
logging.info("fsCollection.totalSize()=%s", fsCollection.totalSize())
真的是没有:
logging.info("fsCollection.stats()=%s", fsCollection.stats())
AttributeError: ‘GridFS’ object has no attribute ‘stats’
logging.info("fsCollection.totalSize()=%s", fsCollection.totalSize())
AttributeError: ‘GridFS’ object has no attribute ‘totalSize’
”
而只是:
mongo的shell中,可以用命令:
db.fs.files.totalSize()
或:
db.fs.chunks.totalSize()
查看到总大小
-》pymongo中gridfs并没有实现totalSize这个属性的。
【总结】
mongo的shell中可以通过:
db.fs.files.totalSize()
或:
db.fs.chunks.totalSize()
查看到此处的gridfs这个collection的总大小
但是此处Python代码中用到的是MongoDB的Driver:PyMongo
其中的gridfs这个模块,并没有实现totalSize这个属性,所以代码中调用:
fsCollection.totalSize()
才会报错:
AttributeError: ‘GridFS’ object has no attribute ‘totalSize’
解决办法:
不用这个办法。Python代码中,暂时也不需要这行代码。
非要计算总大小,那再去想办法,比如循环计算单个文件大小加起来,也是可以的。
等有这个需求了再说。
转载请注明:在路上 » 【已解决】远程的mongoDB中GridFS报错:AttributeError GridFS object has no attribute totalSize