Mongodb支持许多有用的数组操作,例如$ push和$ pop,但我似乎无法找到有关其算法复杂性的任何信息,也无法找到它们如何实现以确定其运行时复杂性。任何帮助将不胜感激。
答案 0 :(得分:3)
我认为在涉及Mongo更新时,只有三个相关案例:
1)就地原子更新。例如,只增加一个整数。这非常快。
2)就地更换。整个文档必须重写,但它仍然适合当前空间(它缩小或有足够的填充)。
3)文档迁移。您必须将文档写入新位置。
除此之外,还有更新受影响索引的成本(如果必须移动整个事件,则全部)。
您在文档内部实际执行的操作(推送数组,添加字段)不应对操作的总成本产生任何重大影响,这似乎主要取决于文档的大小(网络和磁盘转移费用。)
答案 1 :(得分:1)
Here's where they are implemented。你可以从中找出复杂性。
这是$pop
运算符,例如(这对我来说似乎是O(N)):
case POP: {
uassert( 10135 , "$pop can only be applied to an array" , in.type() == Array );
BSONObjBuilder bb( builder.subarrayStart( shortFieldName ) );
int n = 0;
BSONObjIterator i( in.embeddedObject() );
if ( elt.isNumber() && elt.number() < 0 ) {
// pop from front
if ( i.more() ) {
i.next();
n++;
}
while( i.more() ) {
bb.appendAs( i.next() , bb.numStr( n - 1 ) );
n++;
}
}
else {
// pop from back
while( i.more() ) {
n++;
BSONElement arrI = i.next();
if ( i.more() ) {
bb.append( arrI );
}
}
}
ms.pushStartSize = n;
verify( ms.pushStartSize == in.embeddedObject().nFields() );
bb.done();
break;
}