我有一组文件需要保持持久性。由于MongoDB处理多文档操作的方式,我需要将这组文档嵌入到容器文档中,以确保我的操作的原子性。
数据非常适合键值配对。有没有办法,而不是这样做:
var container = new mongoose.Schema({
// meta information here
subdocs: [{key: String, value: String}]
})
我可以让subdocs
成为应用子网验证的关联数组(即对象)吗?所以容器实例看起来像:
{
// meta information
subdocs: {
<key1>: <value1>,
<key2>: <value2>,
...
<keyN>: <valueN>,
}
}
由于
答案 0 :(得分:4)
使用Mongoose,我不相信有办法做你所描述的。为了解释,让我们举一个例子,你的密钥是日期,价值是高温,形成像{“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可能不是最好的选择。
答案 1 :(得分:2)
你可以在mongoose模式中使用{strict:false}来实现这种行为,尽管你应该检查对猫鼬的验证和强制转换机制的影响。
var flexibleSchema = new Schema( {},{strict: false})
另一种方法是使用schema.add method,但我不认为这是正确的解决方案。
我看到的最后一个解决方案是将所有数组都放到客户端并使用underscore.js或者你拥有的任何库。但这取决于您的应用程序,文档大小,通信步骤等。