给定: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)