2015-08-19 49 views
1

說我有一個集「帖」,以及後可以被存儲爲上一個帖子文件的陣列,像這樣的評論:

{ 
    ... 
    comments : [ ... ] 
    ... 
} 

如果我想指望一個特定的評論數後,我可以做{ $size : "$comments" }。然而,看着bson二進制格式,它看起來並不像它實際存儲數組大小的任何地方,它只是一個帶有鍵的文檔0,1,2 ...

如果是這樣的話,它必須遍歷所有的評論來計算它們?這看起來效率不高,尤其是如果您有大量的評論超過1000條的帖子。

有這個明顯的修復。只需將計數存儲在文檔中。

{ 
    ... 
    commentCount : 23, 
    comments : [ ... ] 
    ... 
} 

我只是好奇,如果mongo做幕後的事情,這不是我應該擔心的問題。

謝謝。

回答

1

你真的這樣說自己:

「這只是與數字鍵0,1,2文件...」

因此 「最新」 的關鍵指標是該陣列的尺寸的n-1。所以如果最後一個索引是「49」,那麼數組的大小是「50」。

還記得那BSON本身總是解析爲一個本地表示。對於服務器,這是代表陣列的結構,並且是其確實包含length屬性爲好。

所以它不需要「迭代」和計數,它只是從已存儲的信息中讀取信息。


事實上,具體地說,它不會完全this

Value ExpressionSize::evaluateInternal(Variables* vars) const { 
    Value array = vpOperand[0]->evaluateInternal(vars); 

    uassert(17124, 
      str::stream() << "The argument to $size must be an Array, but was of type: " 
          << typeName(array.getType()), 
      array.getType() == Array); 
    return Value::createIntOrLong(array.getArray().size()); 
} 

REGISTER_EXPRESSION(size, ExpressionSize::parse); 
const char* ExpressionSize::getOpName() const { 
    return "$size"; 
} 

在那裏你可以看到,它只是從對象上,吸氣閱讀size()內部評估後。