我一直在想,使用
update
的 mongodb
和 {upsert:true}
选项,是否有可能让 upsertedCount
和 modifiedCount
都为 0?
我理解,
upsertedCount
指的是创建的文档,而modifiedCount
指的是更新的文档。
因此,使用
upsert
我找不到这两个值都等于 0 的场景。
我错了吗?
提前感谢您的帮助。
我认为你的假设是正确的。 Upsert 基本上意味着如果找不到文档则创建一个新文档。 因此,如果您在更新时将其设置为 true,要么文档存在并将被修改(将 moddedCount 设置为 1),要么文档不存在(将 upsertCount 设置为 1)
存在两者都为零的情况。 如果您在更新操作中使用某个过滤器,而不是在查询中,并且此过滤器不匹配,则它可能会找到文档,将 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 不存在,则找到文档但不会修改文档。
$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
}