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

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

Susan Sarandon
Susan Sarandon原创
2024-11-02 11:07:02897浏览

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

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

在 MongoDB 中创建集合并使用 createIndex({"uid":1 , "sid": 1 添加唯一索引时},{unique:true,dropDups: true}),尽管存在唯一键约束,但可能仍会插入重复文档。

MongoDB Shell 解析

在检查索引创建时,可能会遇到指示“重复键错误”的错误消息。这是因为 MongoDB 3.0.0 有一个 bug,当存在重复项时,无法创建索引。

要解决此问题,请首先使用聚合查询和 $match 运算符删除重复记录。

<code class="javascript">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 }});
});</code>

删除重复项后,可以创建唯一索引而不会遇到错误。

PHP 解决方案

要插入尚不存在的文档或更新现有文档,请使用 update() 方法,并将 upsert 选项设置为 true。

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

如果文档不存在,这将插入文档,否则它将通过设置 $set 数组中指定的字段来更新文档。

其他注意事项

  • 中使用的 dropDups 选项MongoDB 3.0.0 中不再提供初始索引创建。
  • .update() 方法语法需要三个参数:“query”、“update”和“options”。
  • “更新”文档中的更新操作不应多次访问同一路径。

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

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