我有一个包含 5200 万条记录的用户集合。每个用户文档都有一个评论列表,并且comment_id
上面有一个唯一的索引。
{
_id:123,
user_name:"xyz",
comments:[
{
comment_id:123,
text:"sd"
},
{
comment_id:234,
text:"sdf"
}
......,
(63000 elements)
]
}
索引的大小totalIndexSize
为comment_id
104GB。我在 52M 中大约有 100 个文档,其中评论数组中有 63000 个元素。
我的目标是删除旧评论并将评论数组的大小减少 80% 以上。早些时候,当我尝试使用此查询更新文档时
db.user.updateOne({_id:_id},{$set: {"comments":newCommentsArray}},upsert=True)
这里 newCommentsArray 的大小约为 400。此操作执行大约需要 130 秒。
我的问题是:
1)上面的更新查询花费了 130 秒的原因可能是什么。是因为comment_id
字段上巨大的唯一索引大小吗?(我相信用新的评论数组更新评论数组将尝试重新排列所有已删除的 63000 个元素的索引并将新元素插入索引中。)
2)我有另一种方法使用$pull
,基本上是从评论数组中提取 100 条评论并等待 5 秒,然后执行下一批 100 条评论。你觉得这个解决方案怎么样。
3)如果上述解决方案不好,您能否提出一个将评论数组减少 80% 以上的好方法。