我有一个事件集合,我将通过它来查找特定事件的类别,然后使用$push语句更新我的其他集合。问题是当两个事件具有相同的类别时,它将创建一个重复的,这是我不想要的。
我知道upserts,但我不确定他们是否是最好的方式去处理这个问题?当谈到如何实际编写一个与“$push”语句一起工作的upsert时,我有点困惑。
我现在的更新是这样的:
self.users.update({"user_id": event['userid']}, {'$push': {'campaigns': UserCampaign}})
…其中:
UserCampaign = {
"id": campaign['id'],
"name": campaign['name']
}
“用户活动”不时被同样的信息填满,而且由于我的收藏可能会非常庞大,我希望尽可能高效地完成这项工作。
TLDR;我想更新使用“push”找到的文档中的数组,而不必冒重复的风险。
找到了更好的答案:
通过使用$addToSet,它不会创建重复项(通过将所有词典添加到列表中,我还确保以前创建的词典没有重复项):
如果我刚刚使用了$push,它总是会在用户集合的“campaims”中创建重复的元素。不管有没有厄塞特这件事都发生了。
出于某种原因,每个$都不起作用,但不是必需的,我想PyMongo会帮我处理的。
根据MongoDB Docs和PyMongo Docs将更新的第三个参数作为true发送。
克里斯蒂安的回答有正确的论据,所以我就不谈那部分了(对他的回答投了赞成票)。
不过,你也会问避免重复等问题
这里的关键是确保更新查询的条件部分特定于所需的级别。upsert(或update)只与传递给它的条件一样好。如果upsert找不到符合条件的文档,它将插入一个新文档;如果找到传入的条件,update将只执行$push(或指定的任何更新)(如果找到多个文档,也可以进行多次更新)。
在您的情况下,标准部分是:
确保这部分是唯一的,你会很好-如果这可以匹配多个文件,那么你将有重复的。
相关问题 更多 >
编程相关推荐