[英]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
是有用的功能。 您可以應用多個管道到達所需的位置。 骨料
value
分組,該值將是_id
並增加在文檔集中找到的每個$_id
(原始)的計數。 將項目推docIds
名為docIds
的數組中。 這將為您提供具有多次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.