检查MongoDB upsert是否插入或更新

时间:2012-12-19 15:05:22

标签: mongodb

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

5 个答案:

答案 0 :(得分:36)

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

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

正如在upserted的文档中所说:

  

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

如果插入完成,那么upserted包含新记录的_id,如果更新了记录,它将增加updatedExisting

我确信所有司机都会出现类似的事情。

修改

它实际上是updatedExistingtrue的{​​{1}}字段中的布尔值

答案 1 :(得分:11)

仅供参考,在node.js中:

collection.update( source, target, { upsert: true }, function(err, result, upserted) {
  ...
});

答案 2 :(得分:11)

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

答案 3 :(得分:6)

答案取自" MongoDB应用设计模式"书 !determine whether an upsert was an insert or an update

答案 4 :(得分:0)

在Node.js下使用MongoDB驱动程序3.5.9,我发现将updateOne{ 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/