private static FieldsBuilder ParseProjection(string projection) { var fields = new FieldsBuilder(); if (String.IsNullOrEmpty(projection)) { return(fields); } var projectionDocument = BsonSerializer.Deserialize <BsonDocument>(projection); foreach (var element in projectionDocument) { var value = element.Value; if (value.IsBoolean && value.AsBoolean || value.IsInt32 && value.AsInt32 != 0) { fields.Include(element.Name); } else if (value.IsBoolean && !value.AsBoolean || value.IsInt32 && value.AsInt32 == 0) { fields.Exclude(element.Name); } else { throw Errors.InvalidProjectionFormat(); } } return(fields); }
protected override FrameDLRObject ParseExpress(FrameDLRObject obj) { var rtn = FrameDLRObject.CreateInstance(); var query = new QueryDocument(true); var update = new UpdateDocument(true); FrameDLRObject insert = FrameDLRObject.CreateInstance(FrameDLRFlags.SensitiveCase); var fields = new FieldsBuilder(); var collectionname = ""; foreach (var k in obj.Keys) { if (k.StartsWith("$")) { if (k.ToLower() == "$where") { WhereExpress((FrameDLRObject)obj.GetValue(k), query, fields); } else if (k.ToLower() == "$table") { if (obj.GetValue(k) is string) { collectionname = ComFunc.nvl(obj.GetValue(k)); } } } else { var v = obj.GetValue(k); if (this.CurrentAct == ActType.Query) { if (v is bool) { var bisinclude = (bool)v; if (bisinclude) { fields.Include(k); } else { fields.Exclude(k); } } } else if (this.CurrentAct == ActType.Insert) { insert.SetValue(k, v); } else { if (!(v is FrameDLRObject)) { update.Add(k, BsonValue.Create(v)); } } } } rtn.query = query; rtn.update = update; rtn.insert = insert; rtn.fields = fields; rtn.table = collectionname; return(rtn); }