Пример #1
0
        public static Task <TEntity> AddToArrayWithCount <ArrDataType>(
            IMongoDbSet <TEntity> entity,
            FilterDefinition <TEntity> filter,
            FieldDefinition <TEntity> dbArrayFieldName,
            ArrDataType[] insertValues,
            ArrDataType[] initialValues,
            FieldDefinition <TEntity, int> countFieldDefinition
            )
        {
            bool isIncCountEnabled = countFieldDefinition.ToString() != "";

            // If countFieldDefinition is blank, we dont enable count
            List <ArrDataType> uniqueInserts = new List <ArrDataType>();

            foreach (ArrDataType iVal in insertValues)
            {
                if (Array.IndexOf(initialValues, iVal) == -1)
                {
                    uniqueInserts.Add(iVal);
                }
            }

            int count = uniqueInserts.Count();

            if (count > 0)
            {
                UpdateDefinition <TEntity> update = Builders <TEntity> .Update
                                                    .PushEach(dbArrayFieldName, uniqueInserts)
                                                    .Inc(countFieldDefinition, uniqueInserts.Count());

                return(entity.UpdateOneAsync(filter, update));
            }
            return(null);
        }
Пример #2
0
        public static Task <TEntity> AddToArray <ArrDataType>(
            IMongoDbSet <TEntity> entity,
            FilterDefinition <TEntity> filter,
            FieldDefinition <TEntity> dbArrayFieldName,
            ArrDataType[] insertValues
            )
        {
            UpdateDefinition <TEntity> update = Builders <TEntity> .Update.AddToSetEach(dbArrayFieldName, insertValues);

            Task <TEntity> e = entity.UpdateOneAsync(filter, update);

            return(e);
        }
Пример #3
0
        public static Task <TEntity> UpdateInArray <ArrDataType>(
            IMongoDbSet <TEntity> entity,
            FilterDefinition <TEntity> filter,
            FieldDefinition <TEntity> dbArrayFieldName,
            ArrDataType oldFieldValue,
            ArrDataType newFieldValue
            )
        {
            RemoveFromArray(entity, filter, dbArrayFieldName, new ArrDataType[] { oldFieldValue });
            Task <TEntity> element = AddToArray <ArrDataType>(entity, filter, dbArrayFieldName, new ArrDataType[] { newFieldValue });

            return(element);
        }
Пример #4
0
        public static Task <TEntity> RemoveFromArray <ArrDataType>(
            IMongoDbSet <TEntity> entity,
            FilterDefinition <TEntity> filter,
            FieldDefinition <TEntity> dbArrayFieldName,
            ArrDataType[] fieldValue
            )
        {
            UpdateDefinition <TEntity> update = Builders <TEntity> .Update.PullAll(
                dbArrayFieldName,
                fieldValue
                );

            return(entity.UpdateOneAsync(filter, update));
        }
Пример #5
0
 public InstaPostContext(
     DbContextOptions <InstaPostContext> options,
     IMongoDbSet <Bookmarks> Bookmarks,
     IMongoDbSet <Followers> Followers,
     IMongoDbSet <Likes> Likes,
     IMongoDbSet <Reports> Reports,
     IMongoDbSet <Tags> Tags
     ) : base(options)
 {
     this.Bookmarks = Bookmarks;
     this.Followers = Followers;
     this.Likes     = Likes;
     this.Reports   = Reports;
     this.Tags      = Tags;
 }
        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));
        }
        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));
        }
Пример #8
0
        public static IEnumerable <int> ArrayIntSplice(
            IMongoDbSet <TEntity> entity,
            string dbArrayFieldName,
            FilterDefinition <TEntity> filter,
            int count = 10,
            int skip  = 0
            )
        {
            IFindFluent <TEntity, TEntity> query = entity.Find(filter);

            ProjectionDefinition <TEntity> projection = Builders <TEntity> .Projection.Slice(dbArrayFieldName, skip, count);

            return(query.FirstOrDefault() == null
                   ? null
                   : query
                   .Project(projection)
                   .FirstOrDefault()
                   .GetValue(dbArrayFieldName)
                   .AsBsonArray
                   .Select(e => e.ToInt32()));
        }
Пример #9
0
        public static bool CheckElementExists <FieldDataType>(
            IMongoDbSet <TEntity> entity,
            FieldDefinition <TEntity> dbArrayFieldName,
            FieldDataType element,
            FieldDefinition <TEntity> filterIdFieldName,
            FieldDataType filterIdFieldValue
            ) where FieldDataType : struct
        {
            FilterDefinition <TEntity> arrayFilter = Builders <TEntity> .Filter.ElemMatch <TEntity>(dbArrayFieldName, Builders <TEntity> .Filter.Eq(dbArrayFieldName.ToString(), element));

            FilterDefinition <TEntity> filter = filterIdFieldName == null
                ? arrayFilter
                : Builders <TEntity> .Filter
                                                .Eq(filterIdFieldName.ToString(), filterIdFieldValue)
                                                & arrayFilter;

            long count = entity.Find(filter)
                         .Project(Builders <TEntity> .Projection.Include("_id"))
                         .Count();

            return(count == 0);
        }
 public static IQueryable <TEntity> SearchText <TEntity>(this IMongoDbSet <TEntity> dbSet, string search) where TEntity : class
 {
     return(dbSet.WhereFilter(b => b.Text(search)));
 }