2

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

一个。用户访问网站。

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

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

var sessionId = userSession._id;

C。被userSession放置在本地存储中。

storeInLocalStorage('blahblah', sessionObject);

d。到目前为止,使用 sessionId 作为唯一字段创建了一个 Order 对象。

var newOrder = {
  sessionId: sessionId;
};

e. 显然,此时 Order 对象不会根据架构进行验证,因此我无法将其存储在 Mongo 中。但我仍然想将它存储在 Mongo 中,以便以后可以使用用户首次访问时生成的 sessionID 检索不完整的订单或正在进行的订单。

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

Orders.insert(newOrder);

F。当用户重新访问该站点时,我希望能够从 Mongo 获得不完整的订单并恢复:

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

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

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

  • 我想禁用simpleschemaOrders集合的验证并仍然允许存储到数据库中,以便可以存储部分订单以供以后恢复。

我可以在此处使用此设置有条件地需要一个字段,但这意味着仅在这种情况下将有条件地需要 50 多个字段,这看起来非常麻烦。

4

3 回答 3

1

这是@JeremyK 答案的一个变体:在inProgress您的 type 顺序中添加一个键[Object]。该对象将没有更深层次的验证。将您正在进行的订单数据保留在那里,直到订单最终确定,然后将所有相关数据复制/移动到永久密钥中并移除inProgress密钥。当然,这将要求您将所有真正的键设为可选。优点是对象将在整个生命周期中保持其主键。

于 2015-10-02T16:28:06.043 回答
1

我认为这个特殊情况已经解决了;但以防万一,您可以通过 Collection#rawCollection() 访问 MongoDB 本机 API 来跳过简单模式验证:

Orders.rawCollection().insert(newOrder);
于 2016-11-22T15:00:59.067 回答
1

听起来你想吃蛋糕,也想吃!

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

于 2015-10-02T03:36:31.330 回答