/// <summary> /// Add two number values. If any side are string, concat left+right as string /// </summary> public static BsonValue ADD(BsonValue left, BsonValue right) { // if both sides are string, concat if (left.IsString && right.IsString) { return(left.AsString + right.AsString); } // if any sides are string, concat casting both to string else if (left.IsString || right.IsString) { return(BsonExpressionMethods.STRING(left).AsString + BsonExpressionMethods.STRING(right).AsString); } // if any side are DateTime and another is number, add days in date else if (left.IsDateTime && right.IsNumber) { return(left.AsDateTime.AddDays(right.AsDouble)); } else if (left.IsNumber && right.IsDateTime) { return(right.AsDateTime.AddDays(left.AsDouble)); } // if both sides are number, add as math else if (left.IsNumber && right.IsNumber) { return(left + right); } return(BsonValue.Null); }
/// <summary> /// Create multi documents based on key-value pairs on parameters. DOCUMENT('_id', 1) /// </summary> public static BsonValue DOCUMENT_INIT(string[] keys, BsonValue[] values) { ENSURE(keys.Length == values.Length, "both keys/value must contains same length"); // test for special JsonEx data types (date, numberLong, ...) if (keys.Length == 1 && keys[0][0] == '$' && values[0].IsString) { switch (keys[0]) { case "$binary": return(BsonExpressionMethods.BINARY(values[0])); case "$oid": return(BsonExpressionMethods.OBJECTID(values[0])); case "$guid": return(BsonExpressionMethods.GUID(values[0])); case "$date": return(BsonExpressionMethods.DATE(Collation.Binary, values[0])); case "$numberLong": return(BsonExpressionMethods.LONG(values[0])); case "$numberDecimal": return(BsonExpressionMethods.DECIMAL(Collation.Binary, values[0])); case "$minValue": return(BsonExpressionMethods.MINVALUE()); case "$maxValue": return(BsonExpressionMethods.MAXVALUE()); } } var doc = new BsonDocument(); for (var i = 0; i < keys.Length; i++) { doc[keys[i]] = values[i]; } return(doc); }