明らかな場所のいずれのドキュメントでもこれを見つけることができません。Mongoがアップサート操作で挿入または更新を実行したかどうかを知ることができるかどうか知りたいですか?
5 に答える
はい、あります。安全な呼び出し(またはgetLastError)で、update関数はupsertフィールドとupdatedExistingフィールドを持つ配列を返します。
これのPHPバージョンはここで読むことができます:http://php.net/manual/en/mongocollection.insert.php下部にあります。
それが上のドキュメントの中で言うようにupserted
:
アップサートが発生した場合、このフィールドには新しいレコードの_idフィールドが含まれます。アップサートの場合、このフィールドまたはupdatedExistingのいずれかが表示されます(エラーが発生した場合を除く)。
したがって、upsertedには、挿入が行われた場合は新しいレコードのが含まれ 、レコードが更新された場合_id
は増分されます。updatedExisting
同様のことがすべてのドライバーに現れると確信しています。
編集
またはのupdatedExisting
分野では実際にはブール値になりますtrue
false
参考までに、node.jsでは次のようになります。
collection.update( source, target, { upsert: true }, function(err, result, upserted) {
...
});
参考までに、Mongoose3.6を使用するnode.jsで:
model.update( findquery, updatequery, { upsert: true }, function(err, numberAffected, rawResponse) {
...
});
既存のドキュメントを更新したときのrawResponseは次のようになります。
{ updatedExisting: true,
n: 1,
connectionId: 222,
err: null,
ok: 1 }
また、新しいドキュメントを作成すると、次のようになります。
{ updatedExisting: false,
upserted: 51eebc080eb3e2208a630d8e,
n: 1,
connectionId: 222,
err: null,
(どちらの場合もnumberAffected = 1を返します)
答えは「MongoDBAppliedDesignPatterns」ブックから取られました!アップサートが挿入であったか更新であったかを判別する
Node.jsでMongoDBドライバーを使用すると、次のコマンドを使用し3.5.9
た後に関心のあるこれらのプロパティがあることがわかりました。updateOne
{ upsert: true }
{
modifiedCount: 0,
upsertedId: null,
upsertedCount: 0,
matchedCount: 1
}
アップサートが何かを挿入すると、新しく挿入されたドキュメントIDを取得upsertedCount > 0
して保持します。upsertedId
アップサートが何かを変更すると、が取得されますmodifiedCount > 0
。
すべてのCRUD操作のチュートリアルはこちらhttps://mongodb.github.io/node-mongodb-native/3.6/tutorials/crud/