我有一个事件集合,我将通过它查找特定事件的类别,然后使用 $push 语句更新我的其他集合。问题是当两个事件具有相同的类别时,它会创建一个重复,这是我不想要的。
我知道 upserts,但我不确定它们是否是解决此问题的最佳方式?当谈到如何实际编写一个与“$push”-statement 一起使用的 upsert 时,我有点困惑。
这就是我的更新现在的样子:
self.users.update({"user_id": event['userid']}, {'$push': {'campaigns': UserCampaign}})
..哪里:
UserCampaign = {
"id": campaign['id'],
"name": campaign['name']
}
“UserCampaign”不时会被相同的信息填满,由于我的收藏可能非常庞大,我希望尽可能高效地完成这项工作。
TLDR;我想更新使用“推送”找到的文档中的数组,而不会有重复的风险。
最佳答案
为我的问题找到了更好的答案:
通过使用 $addToSet 它不会创建重复项(我还通过将所有字典添加到列表中来确保之前没有重复项):
self.users.update({"user_id": event['userid']}, {'$addToSet': {'campaigns': UserCampaigns[i]}})
如果我刚刚使用 $push,它总是会在 users 集合中的“campaigns”中创建重复的元素。无论是否使用 upsert,都会发生这种情况。
由于某种原因,$each 不起作用但不是必需的,我猜 PyMongo 会为我解决这个问题。
关于python - 如果元素不存在(无重复),则将元素推送到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11016767/