如何在简单模式中完全跳过验证并允许存储不完整的文档?

时间:2015-10-02 03:01:38

标签: meteor meteor-autoform simple-schema

我正在创建订单表单和为订单定义的架构(某些必填字段,如地址,客户信息,所选项目及其数量等)。

一个。用户访问网站。

湾为其会话生成唯一ID以及时间戳。

var userSession = {
  _id: createId(),
  timestamp: new Date(),
};

var sessionId = userSession._id;

℃。 userSession放置在本地存储空间中。

storeInLocalStorage('blahblah', sessionObject);

d。创建一个Order对象,并将sessionId作为目前唯一的字段。

var newOrder = {
  sessionId: sessionId;
};

即显然,此时Order对象不会根据模式进行验证,因此我无法将其存储在Mongo中。但是我仍然希望将它存储在Mongo中,以便稍后使用在用户初次访问时生成的sessionID来检索不完整的订单或正在进行的订单。

这不起作用,因为验证失败:

Orders.insert(newOrder);

F。当用户重新访问该网站时,我希望能够从Mongo获取不完整的订单并继续:

var sessionId = getLocalStorage('blahblah')._id;
var incompleteOrder = Orders.findOne({'sessionId', sessionId});

所以我不确定如何在完成这些要点的同时做到这一点。

  • 当用户输入表单上的项目以及用户打算提交完整,完整的订单时,我希望对simpleschema集合进行全面Orders验证。

  • 我想在simpleschema集合上禁用Orders验证,并且仍允许存储到数据库中,以便可以存储部分订单以便以后恢复。

    < / LI>

我可以使用this here有条件地创建一个字段,但这意味着只有这个场景才会有条件地需要50多个字段,这看起来非常麻烦。

3 个答案:

答案 0 :(得分:1)

It sounds like you want to have your cake, and eat it too!

我认为这里最好的方法是在Orders集合上保留架构和验证,但在其他地方存储不完整的订单 您可以将它们存储在另一个集合中(具有更宽松的架构),如果您希望它们存储在服务器上(可能用于在登录用户的其他设备上启用恢复),或者更简单地在本地存储中,并仍然启用恢复先前的订单你想要的行为。
只有在订单完成后才能写入Orders集合(并通过验证)。

答案 1 :(得分:1)

以下是@ JeremyK答案的变体:在inProgress类型的订单中添加[Object]密钥。该对象没有更深入的验证。保持正在进行的订单数据,直到订单最终为止,然后将所有相关数据复制/移动到永久密钥中并删除inProgress密钥。这需要您将所有真正的键设为可选的。优点是对象将在整个生命周期中保持其主键。

答案 2 :(得分:1)

我认为这个特例已经解决了;但为了以防万一,您可以通过Collection#rawCollection()访​​问MongoDB本机API来跳过Simple Schemma验证:

Orders.rawCollection().insert(newOrder);