2016-07-15 7 views
0

サブフィールド配列内の同じフィールドを持つ重複したオブジェクトを見つけて削除する方法を見つけようとしています。MongoDBのサブ文書配列に重複するフィールドを見つける方法

基本的に私のコレクションにはこのスキーマがあります。

[{ 
    "_id": ObjectId("578953db976cea724bbdbb60"), 
    "units": [{ 
    "description": "a1" 
    }, { 
    "description": "b1" 
    }, { 
    "description": "a1" 
    }, { 
    "description": "c1" 
    }] 
}, { 
    "_id": ObjectId("578953db976cea724bbdbb61"), 
    "units": [{ 
    "description": "a2" 
    }, { 
    "description": "b2" 
    }, { 
    "description": "a2" 
    }, { 
    "description": "c2" 
    }] 
}] 

同じ記述で重複したフィールドを見つけて削除したいだけです。

したがって、最初のために、私はそれぞれ "A1" とa2" を特定する必要が

おかげ

アップデート(出力があるべき):。。

[{ 
 
    "_id": ObjectId("578953db976cea724bbdbb60"), 
 
    "units": [{ 
 
    "description": "a1" 
 
    }, { 
 
    "description": "b1" 
 
    }, { 
 
    "description": "c1" 
 
    }] 
 
}, { 
 
    "_id": ObjectId("578953db976cea724bbdbb61"), 
 
    "units": [{ 
 
    "description": "a2" 
 
    }, { 
 
    "description": "b2" 
 
    }, { 
 
    "description": "c2" 
 
    }] 
 
}]

+0

達成しようとしているものにある程度の曖昧さがあります。同じオブジェクトをドキュメントから削除すると、そのドキュメントを削除する必要がありますか?それが両方から来たのであれば簡単になるでしょう。 –

+0

重複を削除した後の予想される出力は? – styvane

+0

@TanKimLoongはい両方のアレイから重複したデータを削除したい。 –

答えて

0

JavaScriptを使用

db.COLLECTION.find().forEach(function(element){ 
    var descriptions = element.units.map(function(unit){return unit.description;}) 
    element.units = element.units.filter(function(value, index, array){ 
     return descriptions.indexOf(value) == index; 
    }) 
    db.save(element); 
}) 
0

単純な$setUnionは、あなたに必要なものを与えるはずです。

db.collection.aggregate([ {$project : {_id : "$_id", units : {$setUnion: ["$units"]}}} ])

関連する問題