2

$addToSet如果该值尚未在该数组中,则将新值插入该数组,这很酷,但 update 方法在两种情况下总是返回相同的响应(当值已经存在和不存在时),看起来像这样:

Object {updatedExisting: true, n: 1, connectionId: 34, err: null, ok: 1}

现在我需要确定最后一个查询是否实际上在数组中插入了任何东西。我使用 php 驱动程序。

4

1 回答 1

0

由于 GLE 响应中未报告此信息,因此除了您自己比较/跟踪文档状态之外,没有任何方法可以获取此信息。下面,我将解释为什么使用 oplog 不是一个可靠的解决方案。

如果您正在处理副本集,GLE 响应将包含一个lastOp字段,该字段告诉您在应用写入后最后一个 oplog 条目的时间戳和增量。即使对于$addToSet您认为是无操作的操作,也会创建一个 oplog 条目。如果您要使用它来查看local数据库的oplog.rs集合,您会发现$addToSet被转换为$set数组字段的 a (执行后的值是其状态$addToSet)。即使对于“no-op”$addToSet操作,这也会重新设置数组的值,因为 oplog 需要一条记录来说明“字段在时间戳/增量时具有值”。

理论上,您可以通过 oplog 回溯并在同一文档的数组字段上查找先前的操作以进行比较,但是(1)您不能保证先前的操作仍在 oplog 中,并且(2)可能是数组字段在我们手术之前是空的或失踪的。

于 2013-08-19T18:58:10.980 回答