如何判断$ addToSet是否插入新值?

时间:2013-07-28 18:37:49

标签: php mongodb

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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