【问题标题】:Delete Documents that have the same of certain field [duplicate]删除具有相同特定字段的文档[重复]
【发布时间】:2019-03-08 21:50:20
【问题描述】:

我在 MongoDB 中有一个数据,我想删除所有重复的文档。问题是 MongoDB 为每个项目分配一个唯一的_id,所以我不能只删除重复的项目。我在每个文档中有一个名为name 的字段,我想删除具有相同name 的项目。 例如:

[{_id: 5c7e423f0bdaa9aeb5399e90,
name ="A"
grade = 16
enrolled ="dddh"
},

{_id: 5c7e423f1bdaa9aeb5399e90,
key ="B"
grade =17
note ="ddddd"
},

{_id: 5c7e423d0bdaa9aeb5399e90,
key ="B"
score =17
note ="ddddd"
}]

到:

[{_id: 5c7e423f0bdaa9aeb5399e90,
name ="A"
grade = 16
enrolled ="dddh"
},

{_id: 5c7e423f1bdaa9aeb5399e90,
name ="B"
grade =17
enrolled ="ddddd"
}]

列表可能很大,所以有什么有效的方法吗?

【问题讨论】:

  • 请注意,当您声明自己时“MongoDB 为每个项目分配一个唯一的 _id”,但由于“复制/粘贴”,您发布的问题的数据显示相同的 _id 值.这可能(并且曾经)让查看问题的人感到困惑。此外,MongoDB 中的文档不是 JSON,当您使用该术语时会进一步混淆
  • _id 值在问题中有所不同。我也在询问 JSON 数组。 MongoDB 中的文档不是 JSON,但我用 JS 处理它们后,它们变成了 JSON。
  • 阅读链接。您可以返回删除“重复项”的数据
  • 我之前已经阅读过这些链接,但它在我的查询中不起作用,因为 distinct() 不适用于 sort()find()

标签: javascript mongodb


【解决方案1】:

首先请注意,您的结构包含大量语法错误。现在,一种解决方案是在原始对象数组上使用Array.reduce() 来生成一个新的object,使用name 属性作为这个新对象的keys。这将确保您最终只会为每个 name 属性关联一个对象。最后,您可以使用Object.values() 来获得您想要的输出。

let input = [
  {
    _id: "5c7e423f0bdaa9aeb5399e90",
    name: "A",
    grade: 16,
    enrolled: "dddh"
  },
  {
    _id: "5c7e423f1bdaa9aeb5399e90",
     name: "B",
     grade: 17,
     note: "ddddd"
  },
  {
    _id: "5c7e423d0bdaa9aeb5399e90",
    name: "B",
    score: 17,
    note: "ddddd"
  }
];

let res = input.reduce((acc, curr) =>
{
    acc[curr.name] = acc[curr.name] || curr;
    return acc;
}, {});

console.log(Object.values(res));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

【讨论】:

  • 这个问题的标题不好。它实际上是在询问“MongoDB 集合中的文档”而不是“JavaScript 中的对象数组”,这就是您所回答的。
  • “JavaScript 中的对象数组”正是我要问的……答案很完美。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2018-04-27
相关资源
最近更新 更多