1

注文が作成されるとき、ドキュメントには次のスキーマがあります。

{order:1,startTime:1402442830110}

注文が完了すると、db.collection.findAndModify()操作が処理されて endTime が設定され、次のようなドキュメントになります。

{order:1,startTime:1402442830000,endTime:1402442930000}

同じプロセスで、duration両方の時間を差し引いて計算された order を設定する必要がありますdoc.endTime-doc.startTime

1回の操作でこれを行うのに役立つオペレーターまたは手順はありますか? それとも、FindAndModify 操作を 2 回実行する必要がありますか? 1 つは新しいドキュメントを返す新しいデータを設定する操作で、もう 1 つはdurationフィールドを設定する操作です。

4

3 に答える 3

2

私が理解していることから、SQLに変換すると、このようなことをしたい

UPDATE [Order] SET
    EndTime = GETDATE(),
    Duration = GETDATE() - StartTime
WHERE OrderID = ''

残念ながら、これは MongoDB ではまだサポートされていません。ただし、2 回の更新でそれを行うことができます。最初のものは必ずしも afindAndModifyではなく、 afindOneで十分です。

var startTime = db.order.findOne({order: 1}).startTime;
var endTime = new Date();
db.order.findAndModify({
    query: {order: 1},
    update: {$set: {endTime: endTime, duration: endTime - startTime}}
});

実際には、同じ注文が複数回更新されるのを防ぎたい場合を除き、 findAndModifyhere が pure よりも有利になるとは思いません。updateこの場合、次のように条件を変更することをお勧めします。

var startTime = db.order.findOne({order: 1}).startTime;
var endTime = new Date();
db.order.findAndModify({
    query: {order: 1, endTime: {$exists: false}},
    update: {$set: {endTime: endTime, duration: endTime - startTime}}
});

私の見解では、注文済み/支払い済み/キャンセル済みなど、注文のステータスを制御する何かが必要です...ステータスで注文をロックするには、{endTime: {$exists: false}}.

于 2014-06-11T01:37:48.520 に答える
0

これは、集計フレームワークを使用して行うことができます。以下にサンプルコードを示します。

db.col.aggregate(
[
    {$match:{order:1}},
    {$project:{order:1, startTime:1,endTime:{$add:[new Date().getTime()]}}},
    {$project:{order:1,startTime:1,endTime:1,duration:{$subtract:["$endTime","$startTime"]}}}
])

指定されたパイプラインは次のように実行されます。

  1. $match は、条件 order=1 に一致する注文を選択します
  2. 最初の $project は、選択した注文に「endTime」プロパティを追加します
  3. 2 番目の $project は、endTime から startTime を差し引いて、選択した注文に期間フィールドを追加します
于 2014-06-11T01:37:11.123 に答える