首頁  >  文章  >  後端開發  >  儘管有唯一索引,為什麼我仍然在 MongoDB 中看到重複文件?

儘管有唯一索引,為什麼我仍然在 MongoDB 中看到重複文件?

Susan Sarandon
Susan Sarandon原創
2024-11-02 11:07:02972瀏覽

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