pymongo如何检查文档是否为空?

时间:2018-10-01 06:11:18

标签: python mongodb pymongo

我试图防止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中检查文档是否为空?

1 个答案:

答案 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)