61

我在文档中任何明显的地方都找不到这个。我想知道是否有可能知道 Mongo 是否在 upsert 操作中执行了插入或更新?

4

5 回答 5

37

是的,在安全调用(或 getLastError)中,更新函数将返回一个带有 upsert 字段和 updatedExisting 字段的数组。

您可以在此处阅读 PHP 版本:http ://php.net/manual/en/mongocollection.insert.php位于底部。

正如它在文档中所说upserted

如果发生了 upsert,该字段将包含新记录的 _id 字段。对于 upsert,此字段或 updatedExisting 将存在(除非发生错误)。

_id因此,如果插入已完成,则upserted 包含新记录的,或者updatedExisting 如果更新记录,它将增加。

我确信所有驱动程序中都会出现类似的情况。

编辑

它实际上是orupdatedExisting字段中的布尔值truefalse

于 2012-12-19T15:12:42.367 回答
11

仅供参考,在 node.js 中:

collection.update( source, target, { upsert: true }, function(err, result, upserted) {
  ...
});
于 2012-12-19T15:33:33.690 回答
10

仅供参考,在 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)

于 2013-07-23T17:27:23.260 回答
6

答案取自《MongoDB 应用设计模式》一书!确定 upsert 是插入还是更新

于 2014-09-23T10:53:29.297 回答
2

在 Node.js 下使用 MongoDB 驱动3.5.9,我发现使用updateOnewith后有这些我们感兴趣的属性{ upsert: true }

{
  modifiedCount: 0,
  upsertedId: null,
  upsertedCount: 0,
  matchedCount: 1
}

当 upsert 插入一些东西时,我们将获取upsertedCount > 0upsertedId保存新插入的文档 ID。当 upsert 修改了某些东西时,我们会得到modifiedCount > 0.

所有 CRUD 操作的教程都在这里https://mongodb.github.io/node-mongodb-native/3.6/tutorials/crud/

于 2020-07-10T09:46:04.063 回答