如何在MongoDB中找到子文档数组中的重复字段

时间:2016-07-15 21:30:59

标签: 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"
  }]
}]




2 个答案:

答案 0 :(得分: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);
})

答案 1 :(得分:0)

一个简单的$setUnion可以为您提供所需的内容。

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