我的用户集合包含许多子文档列表。模式是这样的:
{
_id: ObjectId(),
name: aaa,
age: 20,
transactions:[
{
trans_id: 1,
product: mobile,
price: 30,
},
{
trans_id: 2,
product: tv,
price: 10
},
...]
...
}
所以我有一个疑问。trans_id
在transactions
列表上的所有产品独特,但它可能是可能的,我可能会用同样的再次复制相同的事务trans_id
(由于恶劣的ETL程序)。现在,我想删除那些重复的子文档。我索引trans_id认为不是unique
。我读到有关dropDups
期权的信息。但是它将删除数据库中存在的特定重复项,还是删除整个文档(我绝对不希望这样做)。如果没有怎么办呢?
PS:我正在使用MongoDB 2.6.6版本。
对于我们在这里看到的所有情况,最近的情况是,现在您需要一种定义数组中“不同”项目的方法,其中某些项目实际上是数组中其他项目的“精确副本”。
最好的情况是在循环的集合操作中$addToSet
与$each
修饰符一起使用。理想情况下,您可以使用Bulk Operations API来利用减少的流量:
var bulk = db.collection.initializeOrderedBulkOperation();
var count = 0;
// Read the docs
db.collection.find({}).forEach(function(doc) {
// Blank the array
bulk.find({ "_id": doc.id })
.updateOne({ "$set": { "transactions": [] } });
// Resend as a "set"
bulk.find({ "_id": doc.id })
.updateOne({
"$addToSet": {
"trasactions": { "$each": doc.transactions }
}
});
count++;
// Execute once every 500 statements ( actually 1000 )
if ( count % 500 == 0 ) {
bulk.execute()
bulk = db.collection.initializeOrderedBulkOperation();
}
});
// If a remainder then execute the remaining stack
if ( count % 500 != 0 )
bulk.execute();
因此,只要“重复”的内容“完全相同”,则此方法将起作用。如果实际上唯一的“重复项”是“ trans_id”字段,则您需要一种完全不同的方法,因为没有“整个文档”被“重复项”,这意味着您需要更多的逻辑来执行此操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句