如果元素不存在(没有重复项),则将其推送到数组中

2024-05-17 06:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个事件集合,我将通过它来查找特定事件的类别,然后使用$push语句更新我的其他集合。问题是当两个事件具有相同的类别时,它将创建一个重复的,这是我不想要的。

我知道upserts,但我不确定他们是否是最好的方式去处理这个问题?当谈到如何实际编写一个与“$push”语句一起工作的upsert时,我有点困惑。

我现在的更新是这样的:

self.users.update({"user_id": event['userid']}, {'$push': {'campaigns': UserCampaign}})

…其中:

UserCampaign = {
        "id": campaign['id'],
        "name": campaign['name']
}

“用户活动”不时被同样的信息填满,而且由于我的收藏可能会非常庞大,我希望尽可能高效地完成这项工作。

TLDR;我想更新使用“push”找到的文档中的数组,而不必冒重复的风险。


Tags: nameselfid方式事件update语句类别
3条回答

找到了更好的答案:

通过使用$addToSet,它不会创建重复项(通过将所有词典添加到列表中,我还确保以前创建的词典没有重复项):

self.users.update({"user_id": event['userid']}, {'$addToSet': {'campaigns': UserCampaigns[i]}})

如果我刚刚使用了$push,它总是会在用户集合的“campaims”中创建重复的元素。不管有没有厄塞特这件事都发生了。

出于某种原因,每个$都不起作用,但不是必需的,我想PyMongo会帮我处理的。

根据MongoDB DocsPyMongo Docs将更新的第三个参数作为true发送。

self.users.update({"user_id": event['userid']}, {'$push': {'campaigns': UserCampaign}}, True)

克里斯蒂安的回答有正确的论据,所以我就不谈那部分了(对他的回答投了赞成票)。

不过,你也会问避免重复等问题

这里的关键是确保更新查询的条件部分特定于所需的级别。upsert(或update)只与传递给它的条件一样好。如果upsert找不到符合条件的文档,它将插入一个新文档;如果找到传入的条件,update将只执行$push(或指定的任何更新)(如果找到多个文档,也可以进行多次更新)。

在您的情况下,标准部分是:

UserCampaign = {
        "id": campaign['id'],
        "name": campaign['name']
}

确保这部分是唯一的,你会很好-如果这可以匹配多个文件,那么你将有重复的。

相关问题 更多 >