$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)在我们的操作之前,数组字段可能是空的或丢失的。