我的用户文档上有一个名为_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",
[]
]