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

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

Susan Sarandon
Susan Sarandon原創
2024-10-28 15:47:02608瀏覽

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