mongoDB从数组中删除

时间:2017-01-09 08:37:29

标签: json mongodb

我想知道如何从mongoDB中的数组中删除某些元素。 我在集合geojsons中保存了以下json:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "ID": "1753242",
        "TYPE": "8003"
      }
    },
    {
      "type": "Feature",
      "properties": {
        "ID": "4823034",
        "TYPE": "7005"
      }
    },
    {
      "type": "Feature",
      "properties": {
        "ID": "4823034",
        "TYPE": "8003"
      }
    }
  ]
}

我想删除数组features中的每个元素,其中properties.TYPE等于8003。 我用以下语句尝试了它,但它没有删除任何内容。

db.geojsons.aggregate([
{$match: {'features': {$elemMatch : {"properties.TYPE": '8003' }}}},
{$project: {
    features: {$filter: {
        input: '$features',
        as: 'feature',
        cond: {$eq: ['$$feature.properties.TYPE', '8003']}
    }}
}}
])
.forEach(function(doc) {
    doc.features.forEach(function(feature) {
        db.collection.deleteOne(
            { "feature.properties.TYPE": "8003"  }            
        );
        print( "in ")
    });
});

有谁知道,为什么这不会删除任何内容或如何删除匹配的元素? 对我来说,似乎失败在forEach内,因为print语句按预期执行。

3 个答案:

答案 0 :(得分:2)

此处不需要aggregation,您可以使用$pullupdate

db.geojsons.update(
   { "type": "FeatureCollection" }, //or any matching criteria
   {$pull: { "features": { "properties.TYPE": "8003"} }}
);

答案 1 :(得分:1)

您可以使用$pull删除数组中的特定元素

db.geojsons.update({}, {
      $pull: {features: {'properties.TYPE':'8003'}}
    }, {multi:true})

答案 2 :(得分:-1)

我想在这种情况下,正确的解决方案是读取匹配的文档,再次修改并保存。因此,只需创建一个与您想要的文档相匹配的搜索查询:删除数组中您不想要的元素并再次保存。

此外,这句话没有做你想要的:

db.collection.deleteOne(
    { "feature.properties.TYPE": "8003"  }            
);

实际上它正在搜索一个文件,其结构使得feature.properties.TYPE像这样匹配:

{
  "type": "FeatureCollection",
  "features": {
      "properties": {
        "TYPE": "8003"
      }
    }
}

这绝对不是你的结构。