Meteor 如何完全跳过简单模式中的验证,并允许存储不完整的文档?
我正在创建订单表单和为订单定义的模式(某些必填字段,如地址、客户信息、所选项目及其数量等) a。用户访问网站 b。为他们的会话生成唯一的ID以及时间戳Meteor 如何完全跳过简单模式中的验证,并允许存储不完整的文档?,meteor,meteor-autoform,simple-schema,Meteor,Meteor Autoform,Simple Schema,我正在创建订单表单和为订单定义的模式(某些必填字段,如地址、客户信息、所选项目及其数量等) a。用户访问网站 b。为他们的会话生成唯一的ID以及时间戳 var userSession = { _id: createId(), timestamp: new Date(), }; var sessionId = userSession._id; c。userSession放在本地存储器中 storeInLocalStorage('blahblah', sessionObject); d
var userSession = {
_id: createId(),
timestamp: new Date(),
};
var sessionId = userSession._id;
c。userSession
放在本地存储器中
storeInLocalStorage('blahblah', sessionObject);
d。到目前为止,创建了一个Order对象,其中sessionId是唯一的字段
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
- 我想禁用
对simpleschema
集合的验证,并且仍然允许存储到数据库中,以便可以存储部分订单以便稍后恢复Orders
如果您希望将它们存储在服务器上(可能是为了为登录用户启用另一台设备上的恢复),您可以将它们存储在另一个集合中(具有更宽松的模式),或者更简单地存储在本地存储中,并且仍然可以启用所需的恢复前顺序行为。
只有在订单完成(并通过验证)后才能写入订单集合。以下是@JeremyK答案的一个变体:向您的
[Object]
类型的订单添加inProgress
键。此对象将没有更深入的验证。将您的进行中订单数据保存在其中,直到订单最终确定,然后将所有相关数据复制/移动到永久键中,并移除inProgress
键。当然,这需要将所有真正的键都设置为可选的。优点是对象在整个生命周期中都会保持其主键。我认为这个特殊情况已经解决;但为了以防万一,您可以通过Collection#rawCollection()访问MongoDB本机API来跳过简单的Schemma验证:
是的,我一直想把未完成的订单存放在别处。哎呀。。。。添加了代码。增加了复杂性。更多的功能要协调在一起。我已经尝试将整个对象存储在本地存储中,但是因为本地存储只支持可以序列化的项,所以在从本地存储中检索对象之后,您必须对该对象做额外的工作(数字变成字符串,日期对象变成字符串等),以将其转换回您可以使用的对象。这是个麻烦事。检查EJSON.stringify/EJSON.parse是否能处理数据类型以序列化和解析数据。”流星添加ejson'如果它还不是你的项目的一部分。非常聪明的方式去做它!除非在将_id值插入Orders集合之前从InProgress集合中显式删除该值,否则默认情况下将保留相同的主键(并保留具有非可选值的架构)。i、 e.您可以向Collection.Insert调用提供_id值(假设这是您所引用的主键),它将使用该值,而不是生成新的值。但是,如果您尝试输入一个具有已存在的_id值的对象,但仅使用InProgress.Insert调用生成的_id值,则该操作将失败。这不会发生。
Orders.rawCollection().insert(newOrder);