diff options
author | Mathias Stearn <mathias@10gen.com> | 2013-04-03 19:23:31 -0400 |
---|---|---|
committer | Eric Milkie <milkie@10gen.com> | 2013-04-05 22:23:39 -0400 |
commit | 219986d5caade286de1f40e7ea84ba4f0374d07f (patch) | |
tree | 645f36dbb5c68a40c9284fbfd02c0cc3bb38e288 | |
parent | aefcffa1248b4830699ff84b367246ba1317d748 (diff) | |
download | mongo-219986d5caade286de1f40e7ea84ba4f0374d07f.tar.gz |
Speed up conversion of v8::Arrays to BSON
Two major improvements:
* Use BSONObjBuilder::numStr() to convert index to string (has global
cache of strings for 0-99)
* Use indexed rather than named iteration over the v8::Array
-rw-r--r-- | src/mongo/scripting/engine_v8.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/mongo/scripting/engine_v8.cpp b/src/mongo/scripting/engine_v8.cpp index 7c9403b7760..296e2052699 100644 --- a/src/mongo/scripting/engine_v8.cpp +++ b/src/mongo/scripting/engine_v8.cpp @@ -1583,8 +1583,14 @@ namespace mongo { return; } if (value->IsArray()) { - BSONObj sub = v8ToMongo(value->ToObject(), depth); - b.appendArray(sname, sub); + // Note: can't use BSONArrayBuilder because need to call recursively + BSONObjBuilder arrBuilder(b.subarrayStart(sname)); + v8::Handle<v8::Array> array = value.As<v8::Array>(); + const int len = array->Length(); + for (int i=0; i < len; i++) { + const string name = BSONObjBuilder::numStr(i); + v8ToMongoElement(arrBuilder, name, array->Get(i), depth+1, originalParent); + } return; } if (value->IsDate()) { |