从Mongo中的文档中的字段获取值并删除?

时间:2019-02-07 18:15:10

标签: python mongodb pymongo-3.x

我想用CSV文件中的行更新Mongo数据库集合,并且遇到与我使用distinct有关的错误。我要尝试的是删除在CSV文件中找到其ID的文档。这是代码:

# Read in CSV file
df = pd.read_csv(csv_path)
# Create list of ID values in CSV
pdToList = list(df['id'])
# Get ids from CSV
for counter, value in enumerate(pdToList):
    # find distinct ids in collection
    result = db[coll_name].distinct("id")
    # Loop through IDs in collection
    for id_val in result:
         # Check if ID in collection equals ID in CSV
         if id_val == value:
             # Delete document if it exists in CSV                         
             db[coll_name].delete_one({'id':id_val})
         else:
             pass

此脚本可以很好地运行约100个表,但是随后我收到一条错误消息,提示它太大:  {'ok': 0.0, 'errmsg': 'distinct too big, 16mb cap', 'code': 17217, 'codeName': 'Location17217'}。您知道我如何从文档中获取字段值而不会出现16mb上限错误吗?我读过类似的问题,但没有提出解决方案。

1 个答案:

答案 0 :(得分:0)

这就是我所做的。最好使用find等于数据帧列表中的值的值,而不是尝试另一个for循环,这也许对我的计算机也更好。

# Read in CSV file
df = pd.read_csv(csv_path)
# Create list of ID values in CSV
pdToList = list(df['id'])
# Get ids from CSV
for counter, value in enumerate(pdToList):
    # check if value is in document
    if db[coll_name].find({},{"id":{"$eq": value}}):

        # Delete document if it exists in CSV
        db[coll_name].delete_many({'id':value})

    else:
        pass