簡體   English   中英

Mongodb-從集合中刪除不具有唯一值的文檔

[英]Mongodb - delete docs from collection that do not have unique value

我有這樣的對象的集合:

{"_id":"...", "user":"foo", "value":"a"}, // this one stays coz its user is foo
{"_id":"...", "user":"bar", "value":"a"}, // remove this one
{"_id":"...", "user":"baz", "value":"a"}, // remove this one
{"_id":"...", "user":"qux", "value":"b"}, // this one has unique value so it doesn't get deleted

我想查找並刪除所有具有重復值的對象,除非user為foo

是否有JS mongoshell方法?

好的,這還沒有經過測試,但是可以……這是假設使用Mongoose與數據庫進行交互...

let values = [];
let deleteIds = [];

myModel.find({}).then(docs => {
    docs.forEach(d => {
        if (values.indexOf(d.value)) {
            deleteIds.push(d._id);
        } else {
            values.push(d.value);
        }
    })

    deleteIds.forEach(id => {
        myModel.findOneAndRemove({_id: id});
    });
});

我通過使用以下代碼塊解決了此問題(此功能不是完整的代碼):

let query = {
  user:targetedUser
}
let projection = {
  _id:0, id:1, user:1
}


collection.find(query, projection)
      .on('data', doc => {
        collection.deleteMany({id:doc.id, user: {$not: new RegExp(targetedUser)}})
      })
      .on('end', _=> {
        db.close()
      })

基本上, targetedUser變量是要保留的對象的值,同時刪除所有重復且不匹配該值的所有其他對象。 查看它,從其他用戶中刪除所有重復項,同時保留給特定用戶。

這是非常具體的情況,對於常見問題可能有所不同。 但是,這個答案的重點是,這段代碼看起來像是要吃掉所有的RAM,但與300萬條記錄相比,它占用的內存不會超過20MB,而且與到目前為止我嘗試過的其他實現相比,它還是很快的。

這是我在mongoDB中獲取重復項的觀點。 aggregate是有用的功能。 您可以應用多個管道到達所需的位置。 骨料

  1. 匹配所有不等於foo的用戶
  2. 將它們按value分組,該值將是_id並增加在文檔集中找到的每個$_id (原始)的計數。 將項目推docIds名為docIds的數組中。
  3. 從這個新集合中獲取$ count> 1的所有行/文檔
  4. 放松(請檢查文檔以獲得更好的解釋)

這將為您提供具有多次value文件。 對結果集感到滿意后,便可以對這些文檔執行刪除操作。 我還沒有手動運行它...讓我們知道..

db.collection.aggregate([{
            $match: {
                "user": {
                    $ne: "foo"
                }
            }
        }, {
            $group: {
                _id: "$value",
                docIds: {
                    $push: "$_id"
                },
                count: {
                    $sum: 1
                }
            }
        }, {
            $match: "$count": {
                $gt: 1
            }
        }, {
            $unwind: $docIds
        }
    ])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM