mongodb - 查找具有相同字段但大小写不同的所有文档

7
我在处理数据库时遇到了麻烦,因为我的用户文档中的电子邮件字段具有不同的大小写(由于创建幽灵用户的能力,等待他们注册)。当用户注册时,我使用其小写版本并覆盖先前的条目。问题是“幽灵”电子邮件没有被转换为小写。
如果创建了Foo@bar.com幽灵用户,然后Foo@bar.com注册,他将被称为'foo@bar.com',因此Foo@bar.com只会污染我的数据库。
我正在寻找一种方法来查找重复条目,在我推出关于大小写的修复之前手动删除不相关的条目。有什么好的想法吗?
谢谢!
2个回答

17

试试这个:

db.users.aggregate([
  { $match: {
    "username": { $exists: true }
  }},
  { $project: {
    "username": { "$toLower": [ "$username" ]}
  }},
  { $group: {
    _id: "$username",
    total: { $sum : 1 }
  }},
  { $match: {
    total: { $gte: 2 }
  }},
  { $sort: {
    total: -1
  }}
]);

这将查找每个具有用户名的用户,将用户名转换为小写字母,然后按用户名进行分组,并显示具有计数大于1的用户名


1
运行良好,但某些应用程序(例如我的Robo3T)需要聚合位于数组符号“[]”内。这将使查询如下:db.users.aggregate([ ... ])。希望这可以帮到你,因为它曾经让我感到困惑。 - A. Markóczy

-1
你可以使用投影(projection)和toLower函数来实现你想要的功能。假设你的集合文档中属性名为"email",以下是一个示例,展示如何实现这个功能:
db.yourcollection.aggregate([
  { $project: {
    "email": { "$toLower" : [ "$email" ] }
  }},
  { $match: {
    "email": /foo@bar.com/
  }}
]);

你好!谢谢回答。问题是我不知道哪些电子邮件是重复的。我对$project不太熟悉,我会去了解一下。你觉得改变$match部分以适应我的需求可能吗? - Dimitrium
在匹配之前,您需要将属性转换为小写,以便获取所有文档。如果您不知道哪个属性可能有重复,可以使用$OR来包含所有属性。 - hellboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接