2

$addToSetその値がまだその配列にない場合、新しい値を配列に挿入します。これはクールですが、 update メソッドは、両方の場合 (値が既に存在する場合と存在しない場合) で常に同じ応答を返します。これは次のようになります。

Object {updatedExisting: true, n: 1, connectionId: 34, err: null, ok: 1}

ここで、最後のクエリが実際に配列に何かを挿入したかどうかを判断する必要があります。私はphpドライバーを使用しています。

4

1 に答える 1

0

これは GLE 応答では報告されないため、ドキュメントの状態を自分で比較/追跡する以外に、この情報を取得する方法はありません。以下では、oplog の使用が信頼できる解決策ではない理由を説明します。

レプリカ セットを扱っている場合、GLE 応答にはlastOp、書き込みが適用された後の最後の oplog エントリのタイムスタンプと増分を示すフィールドが含まれます。何もしないと思われる$addToSet操作でも、oplog エントリが作成されます。これを使用してlocalデータベースのコレクションを調べると、 が配列フィールドの に変換されているoplog.rsことがわかります(値は が実行された後の状態です)。「no-op」操作の場合でも、これにより配列の値がリセットされます。これは、oplog が「このフィールドには、このタイムスタンプ/インクリメントの時点でこの値が含まれている」というレコードが必要だからです。$addToSet$set$addToSet$addToSet

理論的には、oplog をバックトラックして、同じドキュメントの配列フィールドに対する前の操作を探して比較することができますが、(1) 前の操作がまだ oplog にあることは保証されておらず、(2) 配列フィールドの可能性もあります。私たちの操作の前に空であるか行方不明でした。

于 2013-08-19T18:58:10.980 に答える