modifiedCount和upsertedCount都可以为0吗?

问题描述 投票:0回答:3

我一直在想,使用

update
mongodb
{upsert:true}
选项,是否有可能让
upsertedCount
modifiedCount
都为 0?

我理解,

upsertedCount
指的是创建的文档,而
modifiedCount
指的是更新的文档。

因此,使用

upsert
我找不到这两个值都等于 0 的场景。

我错了吗?

提前感谢您的帮助。

javascript mongodb upsert mongodb-update
3个回答
2
投票

我认为你的假设是正确的。 Upsert 基本上意味着如果找不到文档则创建一个新文档。 因此,如果您在更新时将其设置为 true,要么文档存在并将被修改(将 moddedCount 设置为 1),要么文档不存在(将 upsertCount 设置为 1)


0
投票

存在两者都为零的情况。 如果您在更新操作中使用某个过滤器,而不是在查询中,并且此过滤器不匹配,则它可能会找到文档,将 matchedCount 设置为 1,将 upsertedCount 设置为 0,但因为子-查询不匹配,你的modifiedCount也将是0。 示例数据库:

{ _id: 2 items: [1, 2] }

查询示例:

db.collection.updateOne( {_id: 2}, { $set: { items.$[elem]: 4 } }, { arrayFilters: [{elem: 3}], upsert: true } )

结果:

{ acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 0, upsertedCount: 0 }

这个查询是一种用 4 替换 3 的奇怪方法,但如果 4 不存在,则找到文档但不会修改文档。


0
投票
$setOnInsert

,这实际上是很现实的事情。如果您进行以下更新

db.collection.updateOne(
  { name: "David" },
  { $setOnInsert: { firstSeenAt: new Date() } },
  { upsert: true }
)

这实际上会返回以下内容(
upsertedCount

modifiedCount
均为0)
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 0,
  upsertedCount: 0
}

© www.soinside.com 2019 - 2024. All rights reserved.