首页  >  文章  >  后端开发  >  为什么即使在使用'dropDups”创建唯一键后,我的 MongoDB 集合中仍会出现重复文档?

为什么即使在使用'dropDups”创建唯一键后,我的 MongoDB 集合中仍会出现重复文档?

DDD
DDD原创
2024-11-04 07:10:311065浏览

Why Am I Getting Duplicate Documents in My MongoDB Collection Even After Creating a Unique Key with `dropDups`?

添加唯一键后 MongoDB 重复文档

问题陈述

尽管在“上使用唯一键创建集合” uid”和“sid”字段,重复文档仍在插入到集合中。

技术细节

使用的索引创建命令:

db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})

原因

由于集合中存在重复文档,索引创建失败。在 MongoDB 3.0.0 版本中,“dropDups”选项无法正常运行,导致此问题。

解决方案

  • 删除重复文档: 要解决此问题,请在创建唯一索引之前删除重复文档。这可以通过使用聚合和删除查询来实现。
db.events.aggregate([
    { "$group": {
        "_id": { "uid": "$uid", "sid": "$sid" },
        "dups": { "$push": "$_id" },
        "count": { "$sum": 1 }
    }},
    { "$match": { "count": { "$gt": 1 } }}
]).forEach(function(doc) {
    doc.dups.shift();
    db.events.remove({ "_id": {"$in": doc.dups }});
});
  • 创建唯一索引:删除重复项后,按预期创建唯一索引。
db.events.createIndex({"uid":1 , "sid": 1},{unique:true})

Upsert 操作

对于问题的第二部分,根据现有数据的存在来实现插入或更新文档的所需行为,使用带有“upsert”选项的“.update()”方法:

$collection->update(
    array( "uid" => 1, "sid" => 1 ),
    array( '$set' => $someData ),
    array( 'upsert' => true )
);

这将修改找到的文档并根据需要插入新文档。此外,您可以使用“$setOnInsert”来指定仅应在文档插入期间设置的字段。

以上是为什么即使在使用'dropDups”创建唯一键后,我的 MongoDB 集合中仍会出现重复文档?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn