如何使数组元素在 mongodb 中唯一
How to make array elements unique in mongodb
在我的 mongo 集合中,我有一个数组,其中所有元素都必须是唯一的。
但是错误地,我添加了重复的元素。如何使数组元素不同?
有没有query/command?
集合中的文档:
{
Tags: ["a", "a", "a"]
}
但我想要:
{
Tags: ["a"]
}
您可以在相关 collection
的 tag
属性 上创建唯一索引。
请参考以下官方指南;
这看起来是一个不错的选项,可以清除 mongo shell:
中的重复项
db.collection.aggregate([
{ "$project": {
"Tags": { "$setUnion": [ "$Tags", [] ] },
"same": { "$eq": [
{ "$size": "$Tags" },
{ "$size": { "$setUnion": [ "$Tags", [] ] } }
]}
}},
{ "$match": { "same": false } }
]).forEach(function(doc) {
db.collection.update(
{ "_id": doc._id },
{ "$set": { "Tags": doc.Tags } }
)
})
解释:
- 投影一个只有唯一值的新字段“标签”。
- 设计一个“相同”的新字段,它将检查并说明是否存在重复项。
- 只匹配有重复的文档
- 使用 forEach 循环遍历具有重复标签的文档以替换为唯一版本。
对于 mongo 版本 4.2+,您可以只使用 pipelined updates combined with $setUnion,像这样:
db.collection.updateMany({},
[
{
$set: {
Tags: {
$setUnion: "$Tags"
}
}
}
])
在我的 mongo 集合中,我有一个数组,其中所有元素都必须是唯一的。 但是错误地,我添加了重复的元素。如何使数组元素不同? 有没有query/command?
集合中的文档:
{
Tags: ["a", "a", "a"]
}
但我想要:
{
Tags: ["a"]
}
您可以在相关 collection
的 tag
属性 上创建唯一索引。
请参考以下官方指南;
这看起来是一个不错的选项,可以清除 mongo shell:
中的重复项 db.collection.aggregate([
{ "$project": {
"Tags": { "$setUnion": [ "$Tags", [] ] },
"same": { "$eq": [
{ "$size": "$Tags" },
{ "$size": { "$setUnion": [ "$Tags", [] ] } }
]}
}},
{ "$match": { "same": false } }
]).forEach(function(doc) {
db.collection.update(
{ "_id": doc._id },
{ "$set": { "Tags": doc.Tags } }
)
})
解释:
- 投影一个只有唯一值的新字段“标签”。
- 设计一个“相同”的新字段,它将检查并说明是否存在重复项。
- 只匹配有重复的文档
- 使用 forEach 循环遍历具有重复标签的文档以替换为唯一版本。
对于 mongo 版本 4.2+,您可以只使用 pipelined updates combined with $setUnion,像这样:
db.collection.updateMany({},
[
{
$set: {
Tags: {
$setUnion: "$Tags"
}
}
}
])