gpt4 book ai didi

mongodb - 在集合 Mongodb 中的每个文档上调用自定义 python 函数

转载 作者:可可西里 更新时间:2023-11-01 10:03:04 25 4
gpt4 key购买 nike

我想对整个集合中每个文档的某些现有属性调用自定义 python 函数将结果作为新的键值对存储在该(相同)文档中。我可以知道是否有任何方法可以做到这一点(因为每个电话都独立于其他电话)?

我注意到了 cursor.forEach 但是仅仅有效地使用 python 不能完成吗?

一个简单的例子是将字符串拆分为 text 并存储编号。单词作为新属性。

def split_count(text):
# some complex preprocessing...

return len(text.split())

# Need something like this...
db.collection.update_many({}, {'$set': {"split": split_count('$text') }}, upsert=True)

但似乎根据同一文档中另一个属性的值在文档中设置新属性是 not possible这边呢。这篇文章很旧,但问题似乎仍然存在。

最佳答案

我找到了一种使用 parallel_scan 在集合上调用任何自定义 python 函数的方法在 PyMongo 中。

def process_text(cursor):
for row in cursor.batch_size(200):
# Any complex preprocessing here...
split_text = row['text'].split()

db.collection.update_one({'_id': row['_id']},
{'$set': {'split_text': split_text,
'num_words': len(split_text) }},
upsert=True)


def preprocess(num_threads=4):

# Get up to max 'num_threads' cursors.
cursors = db.collection.parallel_scan(num_threads)
threads = [threading.Thread(target=process_text, args=(cursor,)) for cursor in cursors]

for thread in threads:
thread.start()

for thread in threads:
thread.join()

这实际上并不比 cursor.forEach 快(但也没有那么慢),但它可以帮助我执行任意复杂的 python 代码并在 Python 本身中保存结果。

此外,如果我在其中一个属性中有一个 ints 数组,执行 cursor.forEach 会将它们转换为 floats 而我不这样做不想。所以我更喜欢这种方式。

但我很高兴知道是否有比这更好的方法:)

关于mongodb - 在集合 Mongodb 中的每个文档上调用自定义 python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com