2016-07-12 78 views
2

我已经能够在MongoDB集合中添加大量的空键。由于MongoDB中不允许空键,所以我很难在MongoDB中使用常规方法取消键。有使用mongo shell的这种问题的解决方法吗?从文档中删除空字段的名称

{ 
    "foo": "bar", 
    "": "I should not exist, I have no key..." 
} 
+0

您在每个文档中有多少个字段? – styvane

+0

每个文件大约20场 – user1885523

回答

2

我们可以使用批量操作删除空字符串字段。

我们需要迭代光标快照,然后使用bulkWrite方法方法批量更新文档。请注意,我们需要替换文档,因为我们不能在$unset空白字段或重命名它。所以更新操作在这里是不可能的。

let requests = []; 
db.coll.find({ "": { "$exists": true } }).snapshot().forEach(document => { 
    delete document[""]; 
    requests.push({ 
     "replaceOne": { 
      "filter": { "_id": document._id }, 
      "replacement": document 
     } 
    }); 

    if (requests.length === 1000) { 
     // Execute per 1000 operations and re-init 
     db.coll.bulkWrite(requests); 
     requests = []; 
    } 
}); 

// Clean up queues 
if (requests.length > 0) { 
    db.coll.bulkWrite(requests); 
} 
+0

这是切肉刀! – user1885523

0

给这个一抛....

db.collection.find().forEach(function(doc) { 
    delete doc['']; 
    db.collection.save(doc); 
}); 

有一些能力来管理在他们的错误,如空键文件。

+0

不要这样做!这对性能不利。他们是更好的方式来“解除”该领域。 – styvane

+0

请提供更好的解决方案。谢谢。 – arcee123

+0

Thx的想法。这会在我的MongoDB shell版本中触发错误:3.2.5 E QUERY [thread1] SyntaxError:missing]在元素列表之后: – user1885523