MongoDB 查询以查找数组中具有重复值的文档
MongoDB query to find document with duplicate value in array
tldr; 我正在努力构造一个查询
- 进行聚合以获取特定键 ("original_text_source") 上的值计数,
- 在数组中的子文档中
完整描述
我嵌入了包含结构如下的数组的文档:
{
"_id" : ObjectId("0123456789"),
"type" : "some_object",
"relationships" : {
"x" : [ ObjectId("0123456789") ],
"y" : [ ObjectId("0123456789") ],
},
"properties" : [
{
"a" : "1"
},
{
"b" : "1"
},
{
"original_text_source" : "foo.txt"
},
]
}
这些文档是根据整整 10k 个文本文件创建的,这些文件分类在不同的文件夹中。在将文档插入 MongoDB 期间(分批)我搞砸了并移动了一些文件,导致一个文件被导入两次(我的数据库正好有 10001 个文档),但显然我不知道是哪一个。由于其中一个 "original_text_source" 值的计数必须为 2,因此我打算只删除一个。
我阅读了 $elemMatch
的解决方案,但由于我的数组元素是一个文档,我不确定如何继续。也许 mapReduce
?但是我无法将逻辑转移到我的文档结构中。
我也可以只创建一个新集合并重新上传所有内容,但以防我再次搞砸,我宁愿学习如何查询重复项。看起来更优雅:-)
运行 以下:
db.collection.aggregate([
{ $group: {
_id: { name: "$properties.original_text_source" },
idsForDuplicatedDocs: { $addToSet: "$_id" },
count: { $sum: 1 }
} },
{ $match: {
count: { $gte: 2 }
} },
{ $sort : { count : -1} }
]);
给定一个集合,其中包含您在问题中显示的文档的两个副本,上述命令将 return:
{
"_id" : {
"name" : [
"foo.txt"
]
},
"idsForDuplicatedDocs" : [
ObjectId("59d631d2c26584cd8b7b3337"),
ObjectId("59d631cbc26584cd8b7b3333")
],
"count" : 2
}
在哪里...
- 属性
_id.name
是重复值properties.original_text_source
- 属性
idsForDuplicatedDocs
包含每个具有重复 properties.original_text_source
的文档的 _id
值
您可以通过这样的简单聚合找到重复项:
db.collection.aggregate(
{ $group: { _id: "$properties.original_text_source", docIds: { $push: "$_id" }, docCount: { $sum: 1 } } },
{ $match: { "docCount": { $gt: 1 } } }
)
这给你这样的东西:
{
"_id" : [
"foo.txt"
],
"docIds" : [
ObjectId("59d6323613940a78ba1d5ffa"),
ObjectId("59d6324213940a78ba1d5ffc")
],
"docCount" : 2.0
}
"reviewAndRating": [
{
"review": "aksjdhfkashdfkashfdkjashjdkfhasdkjfhsafkjhasdkjfhasdjkfhsdakfj",
"productId": "5bd956f29fcaca161f6b7517",
"_id": "5bd9745e2d66162a6dd1f0ef",
"rating": "5"
},
{
"review": "aksjdhfkashdfkashfdkjashjdkfhasdkjfhsafkjhasdkjfhasdjkfhsdakfj",
"productId": "5bd956f29fcaca161f6b7518",
"_id": "5bd974612d66162a6dd1f0f0",
"rating": "5"
},
{
"review": "aksjdhfkashdfkashfdkjashjdkfhasdkjfhsafkjhasdkjfhasdjkfhsdakfj",
"productId": "5bd956f29fcaca161f6b7517",
"_id": "5bd974622d66162a6dd1f0f1",
"rating": "5"
}
]
tldr; 我正在努力构造一个查询
- 进行聚合以获取特定键 ("original_text_source") 上的值计数,
- 在数组中的子文档中
完整描述
我嵌入了包含结构如下的数组的文档:
{
"_id" : ObjectId("0123456789"),
"type" : "some_object",
"relationships" : {
"x" : [ ObjectId("0123456789") ],
"y" : [ ObjectId("0123456789") ],
},
"properties" : [
{
"a" : "1"
},
{
"b" : "1"
},
{
"original_text_source" : "foo.txt"
},
]
}
这些文档是根据整整 10k 个文本文件创建的,这些文件分类在不同的文件夹中。在将文档插入 MongoDB 期间(分批)我搞砸了并移动了一些文件,导致一个文件被导入两次(我的数据库正好有 10001 个文档),但显然我不知道是哪一个。由于其中一个 "original_text_source" 值的计数必须为 2,因此我打算只删除一个。
我阅读了 $elemMatch
的解决方案,但由于我的数组元素是一个文档,我不确定如何继续。也许 mapReduce
?但是我无法将逻辑转移到我的文档结构中。
我也可以只创建一个新集合并重新上传所有内容,但以防我再次搞砸,我宁愿学习如何查询重复项。看起来更优雅:-)
运行 以下:
db.collection.aggregate([
{ $group: {
_id: { name: "$properties.original_text_source" },
idsForDuplicatedDocs: { $addToSet: "$_id" },
count: { $sum: 1 }
} },
{ $match: {
count: { $gte: 2 }
} },
{ $sort : { count : -1} }
]);
给定一个集合,其中包含您在问题中显示的文档的两个副本,上述命令将 return:
{
"_id" : {
"name" : [
"foo.txt"
]
},
"idsForDuplicatedDocs" : [
ObjectId("59d631d2c26584cd8b7b3337"),
ObjectId("59d631cbc26584cd8b7b3333")
],
"count" : 2
}
在哪里...
- 属性
_id.name
是重复值properties.original_text_source
- 属性
idsForDuplicatedDocs
包含每个具有重复properties.original_text_source
的文档的
_id
值
您可以通过这样的简单聚合找到重复项:
db.collection.aggregate(
{ $group: { _id: "$properties.original_text_source", docIds: { $push: "$_id" }, docCount: { $sum: 1 } } },
{ $match: { "docCount": { $gt: 1 } } }
)
这给你这样的东西:
{
"_id" : [
"foo.txt"
],
"docIds" : [
ObjectId("59d6323613940a78ba1d5ffa"),
ObjectId("59d6324213940a78ba1d5ffc")
],
"docCount" : 2.0
}
"reviewAndRating": [
{
"review": "aksjdhfkashdfkashfdkjashjdkfhasdkjfhsafkjhasdkjfhasdjkfhsdakfj",
"productId": "5bd956f29fcaca161f6b7517",
"_id": "5bd9745e2d66162a6dd1f0ef",
"rating": "5"
},
{
"review": "aksjdhfkashdfkashfdkjashjdkfhasdkjfhsafkjhasdkjfhasdjkfhsdakfj",
"productId": "5bd956f29fcaca161f6b7518",
"_id": "5bd974612d66162a6dd1f0f0",
"rating": "5"
},
{
"review": "aksjdhfkashdfkashfdkjashjdkfhasdkjfhsafkjhasdkjfhasdjkfhsdakfj",
"productId": "5bd956f29fcaca161f6b7517",
"_id": "5bd974622d66162a6dd1f0f1",
"rating": "5"
}
]