在嵌套数组中查找具有重复元素的 mongo 个文档的 ID
Finding ID of mongo documents with duplicated elements in nested array
我想从集合中提取文档的 ID,这些文档具有嵌套在“streetModel”数组中的“drives”对象的重复 ID。
这是我的典型文档:
{
"_id": {
"$oid": "61375bec4fa522001b608568"
},
"name": "Streetz",
"statusDetail": {},
"streetModel": {
"_id": "3.7389-51.0566",
"name": "Kosheen - Darude - Swedish - Trynidad - Maui",
"countryCode": "DEN",
"drives": [{
"_id": -903500698,
"direction": "WEST"
}, {
"_id": 1915399546,
"direction": "EAST"
}, {
"_id": 1294835467,
"direction": "NORTH"
}, {
"_id": 1248969937,
"direction": "EAST"
}, {
"_id": 1248969937,
"direction": "EAST"
}, {
"_id": 1492411786,
"direction": "SOUTH"
}]
},
"createdAt": {
"$date": "2021-09-07T12:32:44.238Z"
}
}
在这个 ID 为 61375bec4fa522001b608568 的特定文档中,在“streetModel”的“drives”数组中,我得到了 ID 为 1248969937 的重复驱动器对象。
我想创建一个对数据库的查询,该查询将 return 存在此类问题的所有文档的 ID(重复的“驱动器”)。
现在我得到了这个:
db.streets.aggregate([
{
$unwind: "$streetModel"
},
{
$unwind: "$drives"
},
{
$group: {
_id: {
id: "$_id"
},
sum: {
$sum: 1
},
}
},
{
$match: {
sum: {
$gt: 1
}
}
},
{
$project: {
_id: "$_id._id",
duplicates: {
drives: "$_id"
}
}
}
])
但事实并非如此。
我尝试了很多方法来重写这个查询,但不幸的是它不起作用。
查询
- 放松
- 按文档 ID + 司机 ID 分组
- 只保留相同驱动器 ID 超过一次的那些
- replace-root是为了让文档更好看,你也可以用$project代替
- 如果你需要更多的阶段,我想你可以添加它,例如获取有这个问题的文件项目只有 docid 的
db.collection.aggregate([
{
"$unwind": {
"path": "$streetModel.drives"
}
},
{
"$group": {
"_id": {
"docid": "$_id",
"driveid": "$streetModel.drives._id"
},
"duplicates": {
"$push": "$streetModel.drives.direction"
}
}
},
{
"$match": {
"$expr": {
"$gt": [
{
"$size": "$duplicates"
},
1
]
}
}
},
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
"$_id",
"$$ROOT"
]
}
}
},
{
"$project": {
"_id": 0
}
}
])
我想从集合中提取文档的 ID,这些文档具有嵌套在“streetModel”数组中的“drives”对象的重复 ID。
这是我的典型文档:
{
"_id": {
"$oid": "61375bec4fa522001b608568"
},
"name": "Streetz",
"statusDetail": {},
"streetModel": {
"_id": "3.7389-51.0566",
"name": "Kosheen - Darude - Swedish - Trynidad - Maui",
"countryCode": "DEN",
"drives": [{
"_id": -903500698,
"direction": "WEST"
}, {
"_id": 1915399546,
"direction": "EAST"
}, {
"_id": 1294835467,
"direction": "NORTH"
}, {
"_id": 1248969937,
"direction": "EAST"
}, {
"_id": 1248969937,
"direction": "EAST"
}, {
"_id": 1492411786,
"direction": "SOUTH"
}]
},
"createdAt": {
"$date": "2021-09-07T12:32:44.238Z"
}
}
在这个 ID 为 61375bec4fa522001b608568 的特定文档中,在“streetModel”的“drives”数组中,我得到了 ID 为 1248969937 的重复驱动器对象。
我想创建一个对数据库的查询,该查询将 return 存在此类问题的所有文档的 ID(重复的“驱动器”)。
现在我得到了这个:
db.streets.aggregate([
{
$unwind: "$streetModel"
},
{
$unwind: "$drives"
},
{
$group: {
_id: {
id: "$_id"
},
sum: {
$sum: 1
},
}
},
{
$match: {
sum: {
$gt: 1
}
}
},
{
$project: {
_id: "$_id._id",
duplicates: {
drives: "$_id"
}
}
}
])
但事实并非如此。
我尝试了很多方法来重写这个查询,但不幸的是它不起作用。
查询
- 放松
- 按文档 ID + 司机 ID 分组
- 只保留相同驱动器 ID 超过一次的那些
- replace-root是为了让文档更好看,你也可以用$project代替
- 如果你需要更多的阶段,我想你可以添加它,例如获取有这个问题的文件项目只有 docid 的
db.collection.aggregate([
{
"$unwind": {
"path": "$streetModel.drives"
}
},
{
"$group": {
"_id": {
"docid": "$_id",
"driveid": "$streetModel.drives._id"
},
"duplicates": {
"$push": "$streetModel.drives.direction"
}
}
},
{
"$match": {
"$expr": {
"$gt": [
{
"$size": "$duplicates"
},
1
]
}
}
},
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
"$_id",
"$$ROOT"
]
}
}
},
{
"$project": {
"_id": 0
}
}
])