如果元素不存在,则将元素推送到数组(无重复)

Ms0*_*s01 6 python mongodb

我有一个事件集合,我正在查找特定事件的类别,然后我使用$ push语句更新我的其他集合.问题是,当两个事件具有相同的类别时,它将创建一个我不想要的副本.

我知道有关upserts但我不确定它们是否是关于此的最佳方式?当涉及到如何实际编写一个与"$ push"-statement一起使用的upsert时,我有点困惑.

这就是我的更新现在的样子:

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

..哪里:

UserCampaign = {
        "id": campaign['id'],
        "name": campaign['name']
}
Run Code Online (Sandbox Code Playgroud)

"UserCampaign"会不时地填充相同的信息,因为我的收藏可能会非常庞大​​,我想尽可能高效地完成这项工作.

TLDR; 我想更新使用"推送"找到的文档中的数组,而不会有重复的风险.

Ms0*_*s01 11

找到了一个更好的答案我的问题:

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

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

如果我刚使用$ push,它将始终在users集合中的"campaign"中创建重复元素.这种情况发生在有和没有upsert.

出于某种原因,$ each不起作用但不是必需的,我猜PyMongo会为我处理这个问题.


Chr*_*tts 9

根据MongoDB DocsPyMongo Docs,将您的更新的第三个参数发送为true .

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