2012-04-18 66 views
4

我正在考虑迁移到mongoDB,但我缺乏一些基本的了解。我的主要问题是“存储的对象如何受到模型更改的影响?”。这里是一个场景,以更好地了解我想知道什么:MongoDB:存储对象如何受到模型更改的影响?

  1. 我创建一个“用户”模型与first_name,姓氏,电子邮件属性。
  2. 我在我的应用程序中创建了25个存储在mongo中的用户(所以它们被存储为{first_name:“xxx”,last_name:“yyy”,email:“zzz”})
  3. 我向我的“用户”模式:用户名
  4. 我在我的应用程序中创建了25个新用户(因此它们被存储为{first_name:“xxx”,last_name:“yyy”,email:“zzz”,用户名:“xyz”})
  5. 我从“用户”模型中删除“first_name”和“last_name”属性。
  6. 我更新了前25个用户中5个的电子邮件地址。

因此,这里是我的问题:

  1. 添加“用户名”属性设置为“用户”模式后,会发生什么情况第一25个对象?他们是否在其BSON定义中收到了“username”属性,其值为空?我的理解是他们只是没有受到感染。
  2. 当我从“用户”模型中删除“first_name”和“last_name”属性时,现有的50个用户会发生什么情况?我想#1适用的答案相同。
  3. 当我更新了10条记录的电子邮件地址后,5个第一个会发生什么?他们是否加入了“用户名”,删除了“first_name”和“last_name”并更新了他们的电子邮件地址?或者只是更新其电子邮件地址?

回答

3

你的直觉是正确的。 MongoDB要求您在应用程序(即数据库之外)中创建和执行数据模型。我认为这是从SQL数据库进行切换时最大的精神障碍之一。

因此,要回答你的问题

  1. 原来的25个User对象不会自动获得一个“用户名”属性。您将需要手动更新现有用户以添加用户名或更新模型以处理没有用户名的情况。

  2. 同上。您将需要手动更新现有记录以删除first_name和last_name属性,或者等待对象更新为未包含它们的未来版本。

  3. 这取决于你如何进行更新。您可以通过替换整个记录进行更新,也可以使用修改器更改单个字段。如果您替换整个记录,那么当前版本的模型将被保存。如果直接修改“email”属性,则其他字段不会被更改。

+0

感谢您的回答!实际上,我一直认为在数据库中定义模型的属性而不是模型本身是很奇怪的,所以不会造成太大的损失;-)所以我猜测单元测试是最终的保护措施,可以防止不必要的模型更改和信息丢失等问题因为错误地删除了模型中的电子邮件属性定义行,并在应用程序中丢失了该信息,因为delayed_job每晚都在更新您的用户! – 2012-04-18 15:05:05

相关问题