Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 如何完全跳过简单模式中的验证,并允许存储不完整的文档?_Meteor_Meteor Autoform_Simple Schema - Fatal编程技术网

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

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

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

a。用户访问网站

b。为他们的会话生成唯一的ID以及时间戳

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
    集合的验证,并且仍然允许存储到数据库中,以便可以存储部分订单以便稍后恢复

我可以使用有条件地要求一个字段,但这意味着仅在这种情况下就有条件地需要50多个字段,这似乎非常麻烦。

我认为最好的方法是在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);