mongodb阵列操作的算法复杂性

时间:2012-07-06 03:46:23

标签: algorithm mongodb

Mongodb支持许多有用的数组操作,例如$ push和$ pop,但我似乎无法找到有关其算法复杂性的任何信息,也无法找到它们如何实现以确定其运行时复杂性。任何帮助将不胜感激。

2 个答案:

答案 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;
    }