20

単純なmongoドキュメント構造を検討します。

{_id、firstTime、lastTime}

クライアントは、既知のIDを持つドキュメントを挿入するか、既存のドキュメントを更新する必要があります。'lastTime'は常に最新の時刻に設定する必要があります。'firstTime'の場合、ドキュメントが挿入されている場合は、'firstTime'を現在の時刻に設定する必要があります。ただし、ドキュメントがすでに作成されている場合、「firstTime」は変更されません。私はそれを純粋にアップサートでやりたいと思います(ルックアップを避けるため)。

http://www.mongodb.org/display/DOCS/Updatingをクロールしましたが、その特定の操作をどのように実行できるかわかりません。

これが不合理なことだとは思いません。配列フィールドで効果的に実行する$push操作と$addToSet操作がありますが、単純なフィールドでは同じことを実行するものはありません。$setIf操作のようなものがあるはずです。

4

4 に答える 4

1

既存のコンテンツに基づいてドキュメントをアップサートしようとしたときに、非常によく似た問題が発生しました。おそらく、このソリューションは次の場合にも機能します。

レコードから_id属性を削除して、更新のクエリ部分でのみ使用してみてください(pymongo talkから翻訳する必要があります...)

myid = doc.get('_id')
del doc['_id']
mycollection.update({'_id':myid}, {'$set':doc}, upsert=True)
于 2013-01-31T21:51:49.290 に答える
1

次のコードを 2 回続けてトリガーすると、最初はドキュメント挿入時にfirstVisitとの両方が設定され (そして応答で返されます)、2 回目は更新のみが行われます(そして が返されます)。lastVisitupsertedIdlastVisitmodifiedCount: 1

Mongo 4.0.5 でテスト済みですが、古いバージョンでも動作するはずです。

db.collection.updateOne(
  {_id: 1}, 
  { 
    $set: { 
      lastVisit: Date.now() 
    }, 
    $setOnInsert: {
      firstVisit: Date.now()
    }
  }, 
  { upsert: true }
);
于 2019-02-22T08:57:40.990 に答える
-1

たった 1 回のアップサートでこれを行う方法はありません。2 つの操作として行う必要があります。最初にドキュメントの挿入を試みます。ドキュメントが既に存在する場合、_id インデックスでの重複キー違反のために挿入は失敗します。次に、更新操作を実行して、lastTime を現在に設定します。

于 2012-05-21T15:57:54.833 に答える