我在文档中任何明显的地方都找不到这个。我想知道是否有可能知道 Mongo 是否在 upsert 操作中执行了插入或更新?
5 回答
是的,在安全调用(或 getLastError)中,更新函数将返回一个带有 upsert 字段和 updatedExisting 字段的数组。
您可以在此处阅读 PHP 版本:http ://php.net/manual/en/mongocollection.insert.php位于底部。
正如它在文档中所说upserted
:
如果发生了 upsert,该字段将包含新记录的 _id 字段。对于 upsert,此字段或 updatedExisting 将存在(除非发生错误)。
_id
因此,如果插入已完成,则upserted 包含新记录的,或者updatedExisting
如果更新记录,它将增加。
我确信所有驱动程序中都会出现类似的情况。
编辑
它实际上是orupdatedExisting
字段中的布尔值true
false
仅供参考,在 node.js 中:
collection.update( source, target, { upsert: true }, function(err, result, upserted) {
...
});
仅供参考,在 node.js 中使用 Mongoose 3.6:
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)
答案取自《MongoDB 应用设计模式》一书!确定 upsert 是插入还是更新
在 Node.js 下使用 MongoDB 驱动3.5.9
,我发现使用updateOne
with后有这些我们感兴趣的属性{ upsert: true }
:
{
modifiedCount: 0,
upsertedId: null,
upsertedCount: 0,
matchedCount: 1
}
当 upsert 插入一些东西时,我们将获取upsertedCount > 0
并upsertedId
保存新插入的文档 ID。当 upsert 修改了某些东西时,我们会得到modifiedCount > 0
.
所有 CRUD 操作的教程都在这里https://mongodb.github.io/node-mongodb-native/3.6/tutorials/crud/