【问题标题】:Mongoose: Saving as associative array of subdocuments vs array of subdocumentsMongoose:保存为子文档的关联数组与子文档的数组
【发布时间】:2013-09-20 21:27:33
【问题描述】:

我有一组需要保持持久性的文档。由于 MongoDB 处理多文档操作的方式,我需要将这组文档嵌入到容器文档中,以确保操作的原子性。

数据非常适合键值对。有什么办法可以代替这样做:

var container = new mongoose.Schema({
   // meta information here
   subdocs: [{key: String, value: String}]
})

我可以改为让subdocs 成为应用子文档验证的关联数组(即对象)?所以容器实例看起来像:

{
   // meta information
   subdocs: {
       <key1>: <value1>,
       <key2>: <value2>,
       ...
       <keyN>: <valueN>,
   }
}

谢谢

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    使用猫鼬,我不相信有办法做你所描述的事情。为了解释,让我们举一个例子,你的键是日期,值是高温,形成像 { "2012-05-31" : 88 } 这样的对。

    让我们看看你提出的结构:

    {
       // meta information
       subdocs: {
           "2012-05-30" : 80,
           "2012-05-31" : 88,
           ...
           "2012-06-15": 94,
       }
    }
    

    因为您必须在 Mongoose 中预先定义架构,所以您必须提前知道您的键名。在这个用例中,我们可能不会提前知道我们将收集数据的日期,所以这不是一个好的选择。

    如果您不使用 Mongoose,您可以毫无问题地执行此操作。 MongoDB 本身擅长将具有新键名的值插入到现有文档中:

    > db.coll.insert({ type : "temperatures", subdocuments : {} })
    > db.coll.update( { type : "temperatures" }, { $set : { 'subdocuments.2012-05-30' : 80 } } )
    > db.coll.update( { type : "temperatures" }, { $set : { 'subdocuments.2012-05-31' : 88 } } )
    {
        "_id" : ObjectId("5238c3ca8686cd9f0acda0cd"),
        "subdocuments" : {
            "2012-05-30" : 80,
            "2012-05-31" : 88
        },
        "type" : "temperatures"
    }
    

    在这种情况下,在 MongoDB 之上添加 Mongoose 会带走 MongoDB 的一些本机灵活性。如果您的用例非常适合 MongoDB 的此功能,那么使用 Mongoose 可能不是最佳选择。

    【讨论】:

      【解决方案2】:

      您可以通过在您的 mongoose 架构中使用 {strict: false} 来实现此行为,但您应该检查对 mongoose 的验证和强制转换机制的影响。

      var flexibleSchema = new Schema( {},{strict: false})
      

      另一种方法是使用schema.add method,但我认为这不是正确的解决方案。

      我看到的最后一个解决方案是将所有数组发送到客户端并使用 underscore.js 或您拥有的任何库。但这取决于您的应用、文档的大小、通信步骤等。

      【讨论】:

        猜你喜欢
        • 2017-09-17
        • 2018-01-26
        • 1970-01-01
        • 2019-06-03
        • 2017-03-21
        • 2017-06-06
        • 2021-02-10
        • 2014-12-02
        相关资源
        最近更新 更多