コード例 #1
0
        public async Task <T> GetDocumentWithSpecificFieldsAsync(string objectIdString, string[] projectionFields)
        {
            // TODO:Mohit Use FilterDefinitionBuilder - as the class is created for specific purpose

            var filter = new BsonDocument();

            filter.Add("_id", objectIdString);

            var projBuilder = new ProjectionDefinitionBuilder <T>();

            ProjectionDefinition <T>[] projections = new ProjectionDefinition <T> [projectionFields.Length];
            for (int i = 0; i < projectionFields.Length; i++)
            {
                var prof = projBuilder.Include(projectionFields[i]);
                projections[i] = prof;
            }

            var projectionDefinition = projBuilder.Combine(projections);
            var resultList           = await this.Collection.Find(filter).Project <T>(projectionDefinition).ToListAsync();

            //var resultList = await collection.Find(filter).ToListAsync();

            if (resultList.Count > 0)
            {
                return(resultList[0]);
            }
            else
            {
                return(null);
            }
        }
コード例 #2
0
        public static ProjectionDefinition <TDocument> CreateMongoProjection(Action <IDocumentProjectionBuilder> projection)
        {
            var builder = new MongoDocumentProjectionBuilder <TDocument>();

            projection?.Invoke(builder);

            return((builder._projections.Count != 1) ? InternalBuilder.Combine(builder._projections) : builder._projections[0]);
        }
コード例 #3
0
        protected virtual ProjectionDefinition <T> CreateProjectionDefinition(
            ProjectionParams projection, ProjectionDefinitionBuilder <T> projectionBuilder)
        {
            projection = projection ?? new ProjectionParams();

            return(projectionBuilder.Combine(
                       projection.Select(field => projectionBuilder.Include(field))
                       ).Exclude(InternalIdFieldName));
        }
コード例 #4
0
        private BsonDocument simpleKeyQuery()
        {
            // Key Query
            rotateCollection();
            BsonDocument query = new BsonDocument();
            int          range = sequence * testOpts.workingset / 100;
            int          rest  = sequence - range;

            int recordno = rest + getNextVal(range);

            query.Add("_id",
                      new BsonDocument("w", workerID).Add("i", recordno));
            DateTime      starttime = DateTime.Now;
            BsonDocument  myDoc;
            List <String> projFields = new List <String>(testOpts.numFields);

            if (testOpts.projectFields == 0)
            {
                myDoc = coll.Find(query).FirstOrDefault();
            }
            else
            {
                int numProjFields = (testOpts.projectFields <= testOpts.numFields) ? testOpts.projectFields : testOpts.numFields;
                int i             = 0;
                while (i < numProjFields)
                {
                    projFields.Add("fld" + i);
                    i++;
                }
                var projection = new ProjectionDefinitionBuilder <BsonDocument>();
                foreach (var field in projFields)
                {
                    projection.Include(field);
                }
                myDoc = coll.Find(query)
                        .Project <BsonDocument>(projection.Combine())
                        .FirstOrDefault();
            }

            if (myDoc != null)
            {
                var taken = (DateTime.Now - starttime).TotalMilliseconds;
                if (taken > testOpts.slowThreshold)
                {
                    testResults.RecordSlowOp("keyqueries", 1);
                }
                testResults.RecordOpsDone("keyqueries", 1);
            }
            return(myDoc);
        }
コード例 #5
0
        private void rangeQuery()
        {
            // Key Query
            rotateCollection();
            BsonDocument query      = new BsonDocument();
            var          projection = new ProjectionDefinitionBuilder <BsonDocument>();
            int          recordno   = getNextVal(sequence);

            query.Add("_id", new BsonDocument("$gt", new BsonDocument("w",
                                                                      workerID).Add("i", recordno)));
            DateTime starttime = new DateTime();
            IAsyncCursor <BsonDocument> cursor;

            if (testOpts.projectFields == 0)
            {
                cursor = coll.Find(query)
                         .Limit(testOpts.rangeDocs)
                         .ToCursor();
            }
            else
            {
                int numProjFields = (testOpts.projectFields <= testOpts.numFields) ? testOpts.projectFields : testOpts.numFields;
                for (int i = 0; i < numProjFields; i++)
                {
                    projection.Include("fld" + i);
                }
                cursor = coll.Find(query)
                         .Project <BsonDocument>(projection.Combine())
                         .Limit(testOpts.rangeDocs)
                         .ToCursor();
            }
            while (cursor.MoveNext())
            {
                var batch = cursor.Current;
                foreach (var doc in batch)
                {
                    // Consume the cursor
                }
            }
            cursor.Dispose();

            var taken = (DateTime.Now - starttime).TotalMilliseconds;

            if (taken > testOpts.slowThreshold)
            {
                testResults.RecordSlowOp("rangequeries", 1);
            }
            testResults.RecordOpsDone("rangequeries", 1);
        }
コード例 #6
0
        public async Task <List <T> > GetAllDocumentsWithSpecificFieldsAsync(string[] projectionFields)
        {
            var filter      = new BsonDocument();
            var projBuilder = new ProjectionDefinitionBuilder <T>();

            ProjectionDefinition <T>[] projections = new ProjectionDefinition <T> [projectionFields.Length];
            for (int i = 0; i < projectionFields.Length; i++)
            {
                var prof = projBuilder.Include(projectionFields[i]);
                projections[i] = prof;
            }

            var projectionDefinition = projBuilder.Combine(projections);
            var result = await this.Collection.Find(filter).Project <T>(projectionDefinition).ToListAsync();

            return(result);
        }
コード例 #7
0
        /// <summary>
        /// 获取字段
        /// </summary>
        /// <param name="fieldsExp"></param>
        /// <returns></returns>
        public ProjectionDefinition <T> IncludeFields <T>(Expression <Func <T, object> > fieldsExp) where T : class, new()
        {
            ProjectionDefinitionBuilder <T> projection = Builders <T> .Projection;

            if (fieldsExp == null)
            {
                return(null);
            }
            List <ProjectionDefinition <T> > list = new List <ProjectionDefinition <T> >();
            NewExpression newExpression           = fieldsExp.Body as NewExpression;

            if (newExpression == null || newExpression.Members == null)
            {
                throw new Exception("fieldsExp is invalid expression format, eg: x => new { x.Field1, x.Field2 }");
            }
            foreach (MemberInfo current in newExpression.Members)
            {
                list.Add(projection.Include(current.Name));
            }
            return(projection.Combine(list));
        }