private static void _traverseToField(BsonDocument doc, string field_name, out string last_field_part, out BsonDocument subdoc)
{
string[] parts = field_name.Split('.');
BsonDocument doc_cur = doc;
for (int pos = 0; pos < (parts.Length - 1); pos++) {
var part_name = parts[pos];
if (doc_cur.Contains(part_name) &&
doc_cur.GetElement(part_name).Value.BsonType == BsonType.Document) {
doc_cur = doc_cur.GetElement(part_name).Value.AsBsonDocument;
} else {
var newsubdoc = new BsonDocument();
doc_cur.Set(part_name, newsubdoc);
doc_cur = newsubdoc;
}
}
last_field_part = parts[parts.Length - 1];
subdoc = doc_cur;
}