我试图防止pymongo.errors.InvalidOperation:在获得聚合函数的结果后,没有要执行的操作。但是,我使用的方式仍然显示pymongo.errors.InvalidOperation: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中检查文档是否为空?
答案 0 :(得分:0)
这里可能有两件事是错误的:一是许多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)
从不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)