【问题标题】:MongoDB/Mongoose not saving nested propertiesMongoDB/Mongoose 不保存嵌套属性
【发布时间】:2014-11-09 09:54:36
【问题描述】:

所以我认为我在做一些愚蠢的事情,因为我一生都无法让以下架构正常工作:

UserSchema = new mongoose.Schema 
  notifications:
    discussion:
        created:
            mobile: 
                stuff: 
                    hey: 
                        type: Boolean
                        default: false
            osx:  
                type: Boolean
                default: false
            web:  
                type: Boolean
                default: true
            email:  
                type: Boolean
                default: true
            sms:  
                type: Boolean
                default: false

一切看起来都很正常,对吧?只是声明一些嵌套属性、它们的类型和它们的默认值?没有。

Information.db.User.find {}, "notifications userSettings", (err, users) ->
    for user in users
        console.log user.notifications.discussion.created
            // prints { mobile: { stuff: {} } }

所有默认值都消失了,我想要存储的实际数据不在哪里。有什么想法???

已编辑以包含用于检索用户的代码。 Information.db.User 是对 Mongoose Schema 的引用,跳过了我的缓存层。用户已经存在于数据库中,我正在尝试添加通知对象,而不是将这些设置存储为字符串化 JSON。

【问题讨论】:

  • 您能否编辑您的问题以包含创建和填充user 的代码?
  • 我已经添加了代码。

标签: mongodb coffeescript mongoose


【解决方案1】:

我很确定您的数据库中有旧的用户对象是在您添加默认值之前创建的,或者它们可能是从另一个项目中遗留下来的。

当我在我的测试项目中实现您的代码时,我使用了一个旧数据库,其中已经有现有用户,并且得到了与您相同的输出。我猜 mongoose 会尝试在这些用户对象上强制使用模式,但它只会输出嵌套字段,并且不会输出任何布尔字段,因为它们为空。

当我使用您的架构创建一个新对象时,它运行良好,并且我获得了所有默认值。如果您也遇到了这个问题,请告诉我。

【讨论】:

  • 我的模式就是这样,但在过去,默认值已分配给尚未拥有它们的对象。我想我将不得不尝试进行迁移以将其全部添加。即便如此,我什至不能让它设置完整的对象做 {$set:{notifications:newNotifications}}
  • 是的,不幸的是,您可能需要一些 dba:ing。使用该 $set 的更新应该可以正常工作。确保你有正确的 newNotifcations 结构。
  • uuuuuhrg 好的。后点是 20/20。希望我从一开始就正确设计了这个。
  • 哈哈,这始终是问题:P 如果您认为它有帮助,请将其标记为已接受的答案 :)
  • 为了扩展,我(官方)通过将每个用户嵌套对象设置为默认值来解决这个问题,然后使用旧设置执行更新。
猜你喜欢
  • 2018-06-30
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多