如何删除重复的嵌入式文档

刺眼的

我的用户集合包含许多子文档列表。模式是这样的:

   {
    _id: ObjectId(),
    name: aaa,
    age: 20,
    transactions:[
        {
         trans_id: 1,
         product: mobile,
         price: 30,
        },
        {
         trans_id: 2,
         product: tv,
         price: 10
        },
        ...]
    ...
   }

所以我有一个疑问。trans_idtransactions列表上的所有产品独特,但它可能是可能的,我可能会用同样的再次复制相同的事务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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章