Mongodb Mongoose:另存为子文档的关联数组与子文档的数组

Mongodb Mongoose:另存为子文档的关联数组与子文档的数组,mongodb,mongoose,Mongodb,Mongoose,我有一组文档需要维护持久性。由于MongoDB处理多文档操作的方式,我需要将这组文档嵌入到容器文档中,以确保操作的原子性 数据在很大程度上依赖于键值配对。有没有什么方法可以代替这样做: var container = new mongoose.Schema({ // meta information here subdocs: [{key: String, value: String}] }) 我可以让子文档成为应用子文档验证的关联数组(即对象)?因此,容器实例将类似于: {

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

数据在很大程度上依赖于键值配对。有没有什么方法可以代替这样做:

var container = new mongoose.Schema({
   // meta information here
   subdocs: [{key: String, value: String}]
})
我可以让
子文档
成为应用子文档验证的关联数组(即对象)?因此,容器实例将类似于:

{
   // meta information
   subdocs: {
       <key1>: <value1>,
       <key2>: <value2>,
       ...
       <keyN>: <valueN>,
   }
}
{
//元信息
子文档:{
: ,
: ,
...
: ,
}
}

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

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

{
   // meta information
   subdocs: {
       "2012-05-30" : 80,
       "2012-05-31" : 88,
       ...
       "2012-06-15": 94,
   }
}
因为必须在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可能不是最佳选择。

您可以通过在Mongoose模式中使用{:false}来实现此行为,尽管您应该检查Mongoose的验证和强制转换机制的含义

var flexibleSchema = new Schema( {},{strict: false})
另一种方法是使用,但我认为这不是正确的解决方案

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