我想使用Python将一些值推入数组。
也许下次当我更新数组时,它会插入一些存在的值,因此它会得到一些重复的值。
我想知道是否有可以避免的重复值。
我应该使用 db.collection.find() 来确定是否应该插入吗?
db.graph.insert_one({"user_id": a.url}, )
for j in a.followers:
db.graph.update({"user_id": a.url}, {"$push": {"following": j.url}})
是的,是对的,在 MongoDB 中使用
$push
更新数组时,需要处理潜在的重复值。虽然使用
db.collection.find()
检查值是否已经存在是一种方法,但这可能会导致性能问题,尤其是在处理大量更新时。
以下是一些更有效地避免 MongoDB 中数组出现重复值的选项:
1. 使用
$addToSet
$addToSet
运算符是专门为此目的而设计的。如果该值尚不存在,它只会将元素添加到数组中。
以下是如何修改的代码以使用
$addToSet
的方法:
db.graph.insert_one({"user_id": a.url}, )
for j in a.followers:
db.graph.update_one({"user_id": a.url}, {"$addToSet": {"following": j.url}})
2. 在数组字段上创建唯一索引
另一种方法是在数组字段上创建唯一索引。这将强制 MongoDB 在文档级别防止重复数组值。
可以使用以下命令创建唯一索引:
db.graph.create_index( { "user_id": 1, "following": 1 }, { unique: true } )
这将创建一个跨越
user_id
和
following
数组的复合唯一索引。这意味着每个
user_id
在其
following
数组中只能有一个唯一的
j.url
。如果尝试插入重复值,MongoDB 将引发错误。
哪种方法适合?
-
$addToSet
更灵活, 因为它允许在必要时在数组中使用重复值。 - 唯一索引更严格, 可以防止在数据库级别出现任何重复。
如果需要绝对确保没有重复并且性能至关重要,请使用唯一索引。否则,
$addToSet
是一个更简单、更灵活的解决方案。