从MongoDB中的ObjectId数组中删除重复的值



我的用户文档上有一个名为_badges的字段,它是ObjectIds。我正在尝试删除数组中的重复值,并通过Mongoose脚本成功地使用了异步迭代器,但这对我来说有点太慢了:

async function removeDuplicateBadges() {
// Use async iterator to remove duplicate badge ids
for await(const userDoc of User.find()) {
console.log(userDoc.displayName)
const badgesStringArray = userDoc._badges.map(badge => {
if(badge === null) return
else return badge.toString()
})
const uniqueBadgesArray = [...new Set(badgesStringArray)]
await User.findByIdAndUpdate(
userDoc._id,
{
_badges: uniqueBadgesArray
}
)
}
}

我尝试使用以下聚合命令执行同样的操作,但似乎没有删除数据库中存储的实际文档上的重复值。

它只在聚合框架用于查询和转换而不是变异底层数据源时返回结果:

db.getCollection("users").aggregate(
[
{ 
"$unwind" : { 
"path" : "$_badges"
}
}, 
{ 
"$group" : { 
"_id" : "$_id", 
"_badges" : { 
"$addToSet" : "$_badges"
}
}
}
])

任何关于删除重复值的有效方法的提示都将受到赞赏,这些方法比使用上面的异步迭代器方法具有更好的时间效率。

也许这会有所帮助:

"$setUnion": [
"_badges",
[]
]

最新更新