我正在创建订单表单和为订单定义的架构(某些必填字段,如地址,客户信息,所选项目及其数量等)。
一个。用户访问网站。
湾为其会话生成唯一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
验证,并且仍允许存储到数据库中,以便可以存储部分订单以便以后恢复。
我可以使用this here有条件地创建一个字段,但这意味着只有这个场景才会有条件地需要50多个字段,这看起来非常麻烦。
答案 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);