首页  >  文章  >  后端开发  >  尽管使用了唯一索引,为什么我仍然在 MongoDB 中看到重复文档?

尽管使用了唯一索引,为什么我仍然在 MongoDB 中看到重复文档?

Susan Sarandon
Susan Sarandon原创
2024-10-28 15:47:02611浏览

Why Am I Still Seeing Duplicate Documents in MongoDB Despite Using a Unique Index?

尽管具有唯一键,MongoDB 仍会重复文档

在 MongoDB 中,在多个字段上创建唯一索引应该可以防止这些字段具有相同值的重复文档字段。然而,在某些情况下,即使添加索引后,仍然可能会插入重复文档。

问题:

在“uid”和“上创建了唯一索引”集合中的“sid”字段,但仍使用 PHP 驱动程序插入这些字段具有重复值的文档。

解决方案:

MongoDB Shell

  1. 检查现有重复项:

    • 执行以下查询以识别现有重复文档:
    db.user_services.aggregate([
        { "$group": {
            "_id": { "uid": "$uid", "sid": "$sid" },
            "dups": { "$push": "$_id" },
            "count": { "$sum": 1 }
        }},
        { "$match": { "count": { "$gt": 1 } }}
    ])
  2. 删除重复项:

    • 对于每个标识为重复项的文档,删除除第一个(原始)文档之外的所有文档:
    db.user_services.remove({ "_id": {"$in": doc.dups }});
  3. 创建唯一索引:

    • 删除所有重复项后,使用以下命令创建唯一索引:
    db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true})

PHP

  1. 使用更新和更新:

    • 不要使用 .insert(),而是使用 .update() 方法,并将“upsert”选项设置为 true。
    <code class="php">$collection->update(
        array( "uid" => 1, "sid" => 1 ),
        array( '$set' => $someData ),
        array( 'upsert' => true )
    );</code>
  2. 处理多个更新:

    • 重构更新查询以正确处理多个更新操作:
    <code class="php">$collection->update(
        array( "uid" => 1, "sid" => 1 ),
        array(
            '$set' => array( "field" => "this" ),
            '$inc' => array( "counter" => 1 ),
            '$setOnInsert' => array( "newField" => "another" )
        ),
        array( "upsert" => true )
    );</code>

以上是尽管使用了唯一索引,为什么我仍然在 MongoDB 中看到重复文档?的详细内容。更多信息请关注PHP中文网其他相关文章!

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