2

注文フォームと注文用に定義されたスキーマを作成しています (住所、顧客情報、選択したアイテムとその数量などの特定の必須フィールド)。

を。ユーザーがサイトにアクセスします。

b. セッションの一意の 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 に格納できません。しかし、ユーザーの最初の訪問時に生成されたセッション ID を使用して、不完全な注文または進行中の注文を後で取得できるように、Mongo に保存したいと考えています。

検証に失敗するため、これは機能しません。

Orders.insert(newOrder);

f. ユーザーがサイトに再アクセスしたときに、Mongo から不完全な注文を取得して再開できるようにしたい:

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

したがって、これらのポイントを達成しながらこれを行う方法がわかりません。

  • ユーザーがフォームにアイテムを入力するとき、およびユーザーが完全な完全な注文を送信しようとしているときに、コレクションの完全なsimpleschema検証が必要です。Orders

  • simpleschemaコレクションの検証を無効Ordersにし、DB への保存を許可して、後で再開するために部分的な注文を保存できるようにしたいと考えています。

ここでこれを使用してフィールドを条件付きで必須にすることができますが、それは、このシナリオのためだけに 50 以上のフィールドが条件付きで必須になることを意味し、非常に面倒に思えます。

4

3 に答える 3

1

ケーキも食べたいみたいですね!

ここでの最善のアプローチは、スキーマと検証を Orders コレクションに保持し、不完全な注文を別の場所に保存することだと思います。
それらをサーバーに保存したい場合は(より緩和されたスキーマを使用して)別のコレクションに保存することができます(おそらくログインしているユーザーの別のデバイスで再開を有効にするため)、またはより単純にローカルストレージに保存し、以前の順序で再開することもできますあなたが望んでいる行動。
注文が完了した (そして検証に合格した) 場合にのみ、Orders コレクションに書き込みます。

于 2015-10-02T03:36:31.330 に答える
1

この特定のケースは解決されたと思います。ただし、念のため、Collection#rawCollection() を介して MongoDB ネイティブ API にアクセスすることで、Simple Schema の検証をスキップできます。

Orders.rawCollection().insert(newOrder);
于 2016-11-22T15:00:59.067 に答える