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



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

基本上,我有一些文档(我目前不确定有多少(具有重复字段:

{
        "_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 文档对这种状态的有效性有点模糊:

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

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

我想关于 JSON 是否应该有重复键有一些争论:JSON 语法是否允许对象中的重复键?但我无法想象javascript(NodeJS,Meteor等(驱动程序会故意这样做。

不过,这有点复杂,因为我们有两个 Meteor 应用程序共享一个数据库。它们基本上是我们软件的前端和管理端。为了运行这两个应用程序,我首先从以下方面开始:

meteor -p 3000

然后我从第二个开始:

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

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

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

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

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

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

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

这将保留每个prior_email值的第一个唯一文档,并删除任何会导致重复键冲突的后续文档。

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

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

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

希望这有帮助。

相关内容

  • 没有找到相关文章