2014-04-17 63 views
0

我有以下格式文档更新_id领域:如何在MongoDB的文档

{ 
    _id: "1232014", 
    account: "123", 
    year: 2014, 
    country: 826 
} 

_id场是由位于account场和year场的总和。

但是,自从我发现同一年的同一个帐户可能在不同国家/地区拥有数据,并且我收到重复的密钥错误。

我需要做的是将country字段作为_id字段的一部分,例如,

_id: "1232014826" 

由于我使用的是从文档中作为更新的一部分价值,我不认为我可以使用$set,所以我想一个forEach()查询,而不是中使用save()

db.account_data.find({"_id" : "1232014"}).forEach(function(doc) { 
    doc._id = doc._id + doc.country; 
    db.collection.save(doc); 
}); 

这不起作用。

有什么方法可以更新_id?或者这是不可能的,因为它是主要关键字段?

+0

@JoachimIsaksson,可能不是因为它实际上是一个真的非常糟糕的答案。让我们尝试删除旧的和坏的答案,并用更好的答案替换它们。 –

+0

我现在看到这是一个类似的问题,你提到的另一个。希望这个问题有更多的细节和背景,并且如果其他人有同样的问题可能会有用。这实际上是对这个问题不被接受的答案,它与我所需要的最相关。 – finoutlook

回答

2

是的,这是不可能的,因为它是的主键字段。如果你真的想这样做,那么你实际上做的是插入一个新的文件,并删除旧的东西:

db.account_data.find({"_id" : "1232014"}).forEach(function(doc) { 
    var oldId = doc._id; 
    var doc._id = doc._id + doc.country; 
    db.collection.remove({ _id: oldId }); 
    db.collection.save(doc); 
}); 
+0

谢谢,这是我需要的答案,我想我可以删除'.find()'参数来更新整个集合。 – finoutlook

+0

当我运行查询时,我结束了一些项目与国家多次附加!例如'1232014826826826826826'。我不知道这是否是因为'doc._id'被设置为自身,导致某种递归错误。为了解决这个问题,我使用从头开始创建的_id来运行查询,即'var doc._id = doc.account + doc.year + doc.country;',它工作正常。任何想法在此赞赏。 – finoutlook