【发布时间】:2015-10-02 00:27:26
【问题描述】:
我正在从Amazon Mechanical Turk 中提取一些数据并将其保存在 mongodb 集合中。
我有多个工人重复每项任务,因为一点冗余可以帮助我检查工作质量。
每次我使用boto AWS python interface 从亚马逊提取数据时,我都会获得一个包含所有已完成 HIT 的文件,并希望将它们插入到集合中。
这是我要插入collection的document:
mongo_doc = \
{'subj_id' :data['subj_id'],
'img_id' :trial['img_id'],
'data_list' :trial['data_list'],
'worker_id' :worker_id,
'worker_exp' :worker_exp,
'assignment_id':ass_id
}
-
img_id是图像数据库中图像的标识符。 -
subj_id是该图像中人物的标识符(每张图像可能有多个)。 -
data_list是我从 AMT 工作人员那里获得的数据。 -
worker_id、worker_exp、assignment_id是关于 AMT 工作器和分配的变量。
使用boto 的连续拉取将包含相同的数据,但我不想在我的集合中有重复的文档。
我知道两种可能的解决方案,但没有一个适合我:
我可以在集合中搜索文档并仅在不存在时插入它。但这会产生非常高的计算成本。
我可以使用upsert 来确保仅当某个键尚未包含时才插入文档。但是所有包含的键都可以复制,因为该任务由多个工作人员重复。
关于第 2 部分的注意事项:
- subj_id、img_id、data_list 可以重复,因为不同的工作人员注释相同的主题、图像并且可以提供相同的数据。
- worker_id、worker_exp、assignment_id可以重复,因为工作人员在同一任务中注释了多个图像。
- 唯一独特的是所有这些字段的组合。
有没有一种方法可以插入 mongo_doc,前提是它之前没有插入?
【问题讨论】:
-
是的。$setOnInsert
-
@BlakesSeven - 非常感谢!你能说明一下典型用法吗?
标签: python mongodb mongodb-query upsert