具有重复字段的Meteor MongoDB Corruption单个文档

时间:2014-12-15 19:38:41

标签: json mongodb meteor

我在一台半生产机器上运行的几个流星应用程序有一个非常奇怪的情况。

基本上,我有一些文件(我实际上不确定目前有多少)有重复的字段:

{
        "_id" : ObjectId("5006040239bcf91fab6311e5"),
        "first_name" : "First Name",
        "landline" : "555 555-5555",
        "last_name" : "Last Name",
        "prior_email" : "newrandomemail@example.net",
        "prior_email" : "newrandomemail@example.net",
}

mongo docs对这个州的有效性有点模糊:

  

BSON文档可能有多个具有相同名称的字段。最   但是,MongoDB接口代表具有结构的MongoDB(例如,   哈希表),不支持重复的字段名称。如果你需要   操纵具有多个具有相同字段的文档   名称,请参阅驱动程序的驱动程序文档。

     

内部MongoDB进程创建的一些文档可能有   重复字段,但没有MongoDB进程会添加重复   字段到现有用户文档。   http://docs.mongodb.org/manual/core/document/#field-names

我想有一些争论,即JSON是否应该有重复的密钥:Does JSON syntax allow duplicate keys in an object? 但我无法想象javascript(NodeJS,Meteor等)驱动程序会故意这样做。

但是,这有点复杂,因为我们有两个Meteor应用程序共享一个数据库。它们基本上是我们软件的前端和管理端。为了运行这两个应用程序,我先用:

开始
meteor -p 3000

然后我用第二个开始:

export MONGO_URL="mongodb://localhost:3001/meteor"
meteor -p 3002

最奇怪的是,当使用第二个应用程序时,该文档的Meteor findOne()调用显示“oldrandomemail@example.net”的“prior_email”值 - 之前已设置的值,之后又更改为“newrandomemail@example.net”。

我知道这些并不是生产部署的最佳实践,但我想知道是否有其他人已经看过这个或者知道可能触发它的是什么......

编辑: 更新数据库的代码非常基本:

Subscribers.update(this._id, {$set: {'prior_email': 'newrandomemail@example.net'}});

1 个答案:

答案 0 :(得分:-1)

如果您确定previous_email标识了重复记录,则可以使用dropDups:true索引创建选项确保唯一索引:

 db.collection.ensureIndex({'prior_email' : 1}, {unique : true, dropDups : true})

这将保留每个prior_email值的第一个唯一文档,并删除任何可能导致重复密钥违规的后续文档。

重要提示:任何缺少previous_email字段的文档都将被视为具有空值,因此缺少关键字段的后续文档将被删除。您可以添加稀疏:真实索引创建选项,以便索引仅适用于具有prior_email字段的文档。

明显谨慎:备份数据库,如果您担心意外数据丢失,请先在暂存环境中尝试此操作。

参考http://docs.mongodb.org/manual/tutorial/create-a-sparse-index/ http://docs.mongodb.org/manual/tutorial/create-a-unique-index/

希望这有帮助。