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