如何使用MongoDB从对象的每个项目中删除属性

时间:2018-10-13 21:28:47

标签: mongodb

我的文档中有一个这样的对象:

revisions: {
  <revisionId>: {
    ...
    someProperty: { ... },
  },
  ...
}

我想从someProperty对象中的每个嵌套对象中删除revisions(即,遍历所有对象的revisionIdId键)。我问是因为,如果不是我宁愿将其转换为数组,而不是在服务器上进行转换,并可能在此期间覆盖所有更新。

我尝试了$unset,但我只知道$[]运算符,该运算符仅适用于数组,例如

$unset: {
  'revisions.$[].someProperty': 1
}

谢谢

1 个答案:

答案 0 :(得分:1)

您快到了:

{ $unset: { someProperty: "" } }

该值与内存无关

然后您可以使用游标遍历每个文档并删除不需要的属性。

db.collection.find().forEach(<function>)

编辑:对不起,意识到这是一个嵌套模型,其中顶层属性具有任意键,这使其更加棘手。

t.forEach(function( row) {
    var newRevisions = [];
    row.revisions.fields.forEach( function( revision ){
        delete revision.someProperty;
        newRevisions.push(revision);
    } )
    t.update(
        { _id: row._id }, 
        { "$set": { "revisions": newRevisions} }
    );
});

巨大的警告,完全未经测试,但应该为您提供一个起点。

  1. 对于每一行
  2. 对于修订对象中的每个修订
  3. 删除someProperty属性
  4. 根据_id将版本属性设置回集合