如何确定$addToSet是否插入了新值


How to determine whether $addToSet inserted new value or not?

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

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

现在我需要确定最后一个查询是否真的向数组中插入了任何内容。我使用php驱动程序。

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

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

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