public void Should_assign_a_non_typed_field_definition_from_a_typed_field_definition() { FieldDefinition<Person, Gender> subject = new ExpressionFieldDefinition<Person, Gender>(x => x.Gender); FieldDefinition<Person> subject2 = subject; var renderedField = subject2.Render(BsonSerializer.SerializerRegistry.GetSerializer<Person>(), BsonSerializer.SerializerRegistry); renderedField.FieldName.Should().Be("g"); renderedField.FieldSerializer.Should().BeOfType<EnumSerializer<Gender>>(); }
public void Should_resolve_an_enum_with_field_type() { var subject = new ExpressionFieldDefinition <Person, Gender>(x => x.Gender); var renderedField = subject.Render(BsonSerializer.SerializerRegistry.GetSerializer <Person>(), BsonSerializer.SerializerRegistry); renderedField.FieldName.Should().Be("g"); renderedField.FieldSerializer.Should().BeOfType <EnumSerializer <Gender> >(); }
public void Should_assign_a_non_typed_field_definition_from_a_typed_field_definition() { FieldDefinition <Person, Gender> subject = new ExpressionFieldDefinition <Person, Gender>(x => x.Gender); FieldDefinition <Person> subject2 = subject; var renderedField = subject2.Render(BsonSerializer.SerializerRegistry.GetSerializer <Person>(), BsonSerializer.SerializerRegistry); renderedField.FieldName.Should().Be("g"); renderedField.FieldSerializer.Should().BeOfType <EnumSerializer <Gender> >(); }
public void Should_resolve_an_array_field_with_field_lambda() { FieldDefinition <Person, IEnumerable <Gender> > subject = new ExpressionFieldDefinition <Person, IEnumerable <Gender> >(x => x.Genders); var renderedField = subject.Render(BsonSerializer.SerializerRegistry.GetSerializer <Person>(), BsonSerializer.SerializerRegistry); renderedField.FieldName.Should().Be("gs"); renderedField.UnderlyingSerializer.Should().BeOfType <ImpliedImplementationInterfaceSerializer <IEnumerable <Gender>, List <Gender> > >(); renderedField.FieldSerializer.Should().BeSameAs(renderedField.UnderlyingSerializer); renderedField.ValueSerializer.Should().BeSameAs(renderedField.FieldSerializer); }
public void CreateIndexes() { var client = new MongoClient(); ; var database = client.GetDatabase("test"); var collection = database.GetCollection<Student>("Users"); var indexKeysDefinition = new IndexKeysDefinitionBuilder<Student>(); Expression<Func<Student, String>> userNameExpression = x=>x.Name; var field = new ExpressionFieldDefinition<Student>(userNameExpression); //indexKeysDefinition.Ascending(); //collection.Indexes.CreateOneAsync(new IndexKeysDefinition<Student>()) }
public async Task <IEnumerable <TEntity> > Search(string name) { _dbCollection = _mongoContext.GetCollection <TEntity>(); var nameFieldDefinition = new ExpressionFieldDefinition <PhoneBook, string>(x => x.Name); List <FilterDefinition <TEntity> > filters = new List <FilterDefinition <TEntity> > { Builders <TEntity> .Filter.Eq("Name", name), }; var filterCombination = Builders <TEntity> .Filter.Or(filters); return(await _dbCollection.FindAsync(filterCombination).Result.ToListAsync()); }
public async void CreateSimpleUniniqueIndex() { var indexKeysDefinitionBuilder = new IndexKeysDefinitionBuilder<Student>(); Expression<Func<Student, String>> userNameExpression = x => x.Name; var field = new ExpressionFieldDefinition<Student>(userNameExpression); var ascendingIndex = indexKeysDefinitionBuilder.Ascending(field); await collection.Indexes.CreateOneAsync(ascendingIndex, new CreateIndexOptions { Name="StudentsNamesUnique", }); }
public static IQueryable <TEntity> SearchGeoNear <TEntity, TCoordinates>(this IMongoDbSet <TEntity> dbSet, Expression <Func <TEntity, object> > targetField, GeoJsonPoint <TCoordinates> point, Expression <Func <TEntity, object> > distanceResultField = null, double?maxDistance = null, double?minDistance = null) where TEntity : class where TCoordinates : GeoJsonCoordinates { var entitySerializer = BsonSerializer.LookupSerializer <TEntity>(); var keyExpressionField = new ExpressionFieldDefinition <TEntity>(targetField); var keyStringField = keyExpressionField.Render(entitySerializer, BsonSerializer.SerializerRegistry); var distanceFieldName = "Distance"; if (distanceResultField != null) { var distanceResultExpressionField = new ExpressionFieldDefinition <TEntity>(distanceResultField); var distanceResultStringField = distanceResultExpressionField.Render(entitySerializer, BsonSerializer.SerializerRegistry); distanceFieldName = distanceResultStringField.FieldName; } var geoNearSettings = new BsonDocument { { "near", point.ToBsonDocument() }, { "key", keyStringField.FieldName }, { "distanceField", distanceFieldName }, //Note: Limit here is maxed as an operational courtesy as future versions will eliminate it (see Jira SERVER-22949) // Additionally, $geoNear operations still have a 16MB document limit in aggregation (see Jira SERVER-18965) { "limit", int.MaxValue } }; if (maxDistance.HasValue) { geoNearSettings.Add("maxDistance", maxDistance.Value); } if (minDistance.HasValue) { geoNearSettings.Add("minDistance", minDistance.Value); } var stage = new BsonDocument { { "$geoNear", geoNearSettings } }; var originalProvider = dbSet.Provider as IMongoFrameworkQueryProvider <TEntity>; var provider = new MongoFrameworkQueryProvider <TEntity>(originalProvider, stage); return(new MongoFrameworkQueryable <TEntity>(provider)); }
protected virtual UpdateDefinition <T> ToUpdateDefinition(Updates <T> updates) { UpdateDefinition <T> updateDefinition = Builders <T> .Update.Combine(); if (updates.Sets != null) { foreach (Update <T> update in updates.Sets) { updateDefinition = updateDefinition.Set(update.PropertyExpression, update.Value); } } if (updates.Increments != null) { foreach (Update <T> update in updates.Increments) { updateDefinition = updateDefinition.Inc(update.PropertyExpression, update.Value); } } if (updates.SetOnInserts != null) { foreach (Update <T> update in updates.SetOnInserts) { updateDefinition = updateDefinition.SetOnInsert(update.PropertyExpression, update.Value); } } if (updates.Pushes != null) { foreach (UpdateCollection <T> update in updates.Pushes) { var property = new ExpressionFieldDefinition <T>(update.PropertyExpression); updateDefinition = updateDefinition.Push(property, update.Value); } } if (updates.Pulls != null) { foreach (UpdateCollection <T> update in updates.Pulls) { var property = new ExpressionFieldDefinition <T>(update.PropertyExpression); updateDefinition = updateDefinition.Pull(property, update.Value); } } return(updateDefinition); }
public static IQueryable <TEntity> SearchGeoNear <TEntity, TCoordinates>(this IMongoDbSet <TEntity> dbSet, Expression <Func <TEntity, object> > targetField, GeoJsonPoint <TCoordinates> point, Expression <Func <TEntity, object> > distanceResultField = null, double?maxDistance = null, double?minDistance = null) where TEntity : class where TCoordinates : GeoJsonCoordinates { var entitySerializer = BsonSerializer.LookupSerializer <TEntity>(); var keyExpressionField = new ExpressionFieldDefinition <TEntity>(targetField); var keyStringField = keyExpressionField.Render(entitySerializer, BsonSerializer.SerializerRegistry); var distanceFieldName = "Distance"; if (distanceResultField != null) { var distanceResultExpressionField = new ExpressionFieldDefinition <TEntity>(distanceResultField); var distanceResultStringField = distanceResultExpressionField.Render(entitySerializer, BsonSerializer.SerializerRegistry); distanceFieldName = distanceResultStringField.FieldName; } var geoNearSettings = new BsonDocument { { "near", point.ToBsonDocument() }, { "key", keyStringField.FieldName }, { "distanceField", distanceFieldName } }; if (maxDistance.HasValue) { geoNearSettings.Add("maxDistance", maxDistance.Value); } if (minDistance.HasValue) { geoNearSettings.Add("minDistance", minDistance.Value); } var stage = new BsonDocument { { "$geoNear", geoNearSettings } }; var originalProvider = dbSet.Provider as IMongoFrameworkQueryProvider <TEntity>; var provider = new MongoFrameworkQueryProvider <TEntity>(originalProvider, stage); return(new MongoFrameworkQueryable <TEntity>(provider)); }
public async Task <Maybe <TValue> > Max <TValue>(Expression <Func <T, TValue> > propertySelector) { var field = new ExpressionFieldDefinition <T, TValue>(propertySelector); // This seems to be a very fast way to get the max. See // https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/#agg-sort-limit-coalescence and // https://stackoverflow.com/questions/32076382/mongodb-how-to-get-max-value-from-collections/41052353 // // We prefer ToListAsync here because an async curser might return empty Batches and code would get // a little more messy in this case. List <TValue> result = await Collection .Find(_session, FilterDefinition <T> .Empty) .Sort(Builders <T> .Sort.Descending(field)) .Limit(1) .Project(propertySelector) .ToListAsync(); if (result.Any()) { return(result.Single()); } return(None <TValue> .Value); }
public void Should_resolve_an_enum_without_field_type() { Expression<Func<Person, object>> exp = x => x.Gender; var subject = new ExpressionFieldDefinition<Person>(exp); var renderedField = subject.Render(BsonSerializer.SerializerRegistry.GetSerializer<Person>(), BsonSerializer.SerializerRegistry); renderedField.FieldName.Should().Be("g"); renderedField.FieldSerializer.Should().BeOfType<EnumSerializer<Gender>>(); }
public XFFieldDefinition(Expression <Func <TDocument, TField> > expression) { _internalDef = new ExpressionFieldDefinition <TDocument, TField>(expression); }