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> >();
        }
Example #4
0
        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);
        }
Example #5
0
        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>())
        }
Example #6
0
        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());
        }
Example #7
0
        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>>();
        }
Example #13
0
 public XFFieldDefinition(Expression <Func <TDocument, TField> > expression)
 {
     _internalDef = new ExpressionFieldDefinition <TDocument, TField>(expression);
 }