2014-12-03 99 views
0

我想更改我的数据库的模式。现在它是这样的:如何使用具有高度动态模式的Mongoose MongoDB

{ 
    "disp":[ 
     { 
      "quantity":1, 
      "date":20141109 
     }, 
     { 
      "quantity":1, 
      "date":20141110 
     }, 
     { 
      "quantity":1, 
      "date":20141111 
     } 
    ] 
} 

“日期”是唯一和索引。 像这样的模式对我来说有一个很大的缺点。我无法以原子方式更新多个日期的“数量”,所以我必须在我的应用程序中实施Two Phase Commits

我测试的替代模式,我觉得这人会满足我的需求

{ 
    "disp":{ 
     "20141109": { 
      "quantity":1 
     }, 
     "20141110": { 
      "quantity":1 
     }, 
     "20141111": { 
      "quantity":1 
     } 
    } 
} 

这样我可以原子一个以上的日期更新量,但我不知道如何与猫鼬的模式,因为这种管理日期可以以高度动态的方式添加和删除。 在集合中将会有很多文档的数量为不同日期指定 ex。一个文件可以只有几个日期的数量,另一个文件可以有几年的数量

是更好地添加/删除字段迫使每个文件有一个日期字段(默认为0数量)或是它最好将strict设置为false? 有什么缺点我不知道?

+0

您的第二个模式格式无效。数组只能保存文档或值。你的意思是'disp:{...}'? – BatScream 2014-12-03 08:44:29

+0

@BatScream是的,我复制并粘贴没有双重检查。感谢您指出 – Edo 2014-12-03 08:47:17

+2

如果您有第二种格式,则不能根据日期执行聚合操作。最好不要有任何动态变量,并且可能在查询选择器中用作键。 – BatScream 2014-12-03 08:51:05

回答

3

如果你想坚持的第二格式,那么它最好使用Mixed Schema Typedisp领域:

var my_schema = new Schema({ disp: {} }); 

var my_schema = new Schema({ disp: Schema.Types.Mixed }); 

是最好添加/删除字段强制每个文档有一个 日期字段(默认为0数量)?

这不是一个好主意,因为您需要在模式中明确指定所有可能的日期。

还是将严格设置为false会更好?

我不会建议这样做,因为它会影响整个架构,而不仅仅是dist字段。

有什么缺点我不知道?

这里有一些缺点,我可以看到:

  • 你会失去其在dist场架构的所有优点;
  • 无法在dist字段上创建索引;
  • 根据日期不同,您将无法执行aggregate operations(与BatScream相比)。

但这并不意味着你的想法不好。使用日期作为键的优点可以克服所有缺点。