python - 如何通过pymongo检查文档是否为空?
问题描述
我试图阻止 pymongo.errors.InvalidOperation: 获取聚合函数的结果后没有要执行的操作。但是,我使用的方式仍然显示 pymongo.errors.InvalidOperation: No operations to execute for db.collection.insert()。我相信结果在开始的情况下不为空。
这是我的代码:
import sys
from pymongo import MongoClient
client = MongoClient()
db = client['movies']
for i in range(1,db.movies.count() + 1):
res = db.ratings.aggregate([
{"$match": {"movieID":str(i)}},
{"$group": {"_id": "$movieID", "avg": {"$avg":"$rating"}}}
])
if list(res) != None:
db.question1.insert(res)
那么如何在MongoDB中检查文档是否为空呢?
解决方案
这里有几件事可能是错误的:一个是很多 pymongo 的函数返回迭代器。例如:
query = db.customers.find({ 'name': 'John' })
# will print the number of Johns
print len(list(query))
# will always print 0, because the query results have already been
# consumed
print len(list(query))
Python 的list
函数接受一个迭代器并创建一个包含迭代器返回的所有元素的列表,因此list(query)
将创建一个包含查询返回的所有内容的列表。但是,如果我们不将结果存储list(query)
在变量中,它们将永远丢失并且无法再次访问;-)
我不确定是否是这种情况aggregate
。如果是这样,你打电话的那一刻你list(res)
基本上消耗了所有的结果,所以当你打电话时你不能再次访问它们,insert(res)
因为它们已经消失了。
另一个问题是list(res)
never None
。如果没有结果,list(res)
那么[]
您实际上想简单地检查一下if list(res)
或if len(list(res)) > 0
。将这两个建议放在一起,我们得到:
import sys
from pymongo import MongoClient
client = MongoClient()
db = client['movies']
for i in range(1,db.movies.count() + 1):
# Convert db.ratings.aggregate directly to a list
# Now `res` is a simple list, which can be accessed
# and traversed many times
res = list(db.ratings.aggregate([
{"$match": {"movieID":str(i)}},
{"$group": {"_id": "$movieID", "avg": {"$avg":"$rating"}}}
]))
if len(res) > 0:
db.question1.insert(res)
推荐阅读
- dart - Dart 中什么时候最好使用 getter 而不是函数?
- python - 将数据框中的逗号分隔值替换为另一个数据框中的值
- r - Leaflet - 欧洲空间网络图和距离岛移除
- django - Django 密码重置错误:未收到 NorReverseMatch 错误
- makefile - 安装 .pro 文件时出错,在 Debian 上具有 Eigen、libigl 依赖项
- r - 如何计算单元格内的分号分隔值?
- visual-studio-code - VS 代码扩展 FTP-Sync:错误:getaddrinfo ENOTFOUND
- android - 尝试在空对象引用上调用虚拟方法 'android.widget.EditText android.support.design.widget.TextInputLayout.getEditText()'
- reactjs - Webpack 和 .css
- python - 'int' 对象在使用 reduce 时不可下标