当数组中不存在元素时,$ addToset与$ push的时间复杂度

mes*_*n10 10 mongodb

给定:Connection为Safe = True,因此Update的返回将包含更新信息.

说我有一个看起来像这样的文件:

[{'a': [1]}, {'a': [2]}, {'a': [1,2]}]
Run Code Online (Sandbox Code Playgroud)

我发出:

coll.update({}, {'$addToSet': {'a':1}}, multi=True)
Run Code Online (Sandbox Code Playgroud)

结果将是:

{u'connectionId': 28,
 u'err': None,
 u'n': 3,
 u'ok': 1.0,
 u'updatedExisting': True
}
Run Code Online (Sandbox Code Playgroud)

即使来文件已经有了这个价值.为了避免这种情况,我可以发出命令.

coll.update({'a': {'$ne': 1}}, {'$push': {'a':1}}, multi=True)
Run Code Online (Sandbox Code Playgroud)

$ addToSet与$ push的时间复杂度比较是什么?

and*_*oot 16

看起来$ addToSet正在执行与命令相同的操作:$ push with $ ne check.两者都是O(N)

https://github.com/mongodb/mongo/blob/master/src/mongo/db/ops/update_internal.cpp

如果速度非常重要,那么为什么不使用哈希:

代替:

{'$addToSet': {'a':1}}
{'$addToSet': {'a':10}}
Run Code Online (Sandbox Code Playgroud)

使用:

{$set: {'a.1': 1}
{$set: {'a.10': 1}
Run Code Online (Sandbox Code Playgroud)