public static void AddNotExpression( this Dictionary <string, object> query, MongoQueryBuilder queryBuilder) { var builtQuery = queryBuilder.Build(); query[MongoOperator.Not.Value] = builtQuery; }
public void TestMongoQuery() { var mongoQuery = new MongoQueryBuilder().GreaterOrEquals("foo", 42); var query = _qb.MongoQuery(mongoQuery).Build(); var result = query["_q"]; Check.That(result).IsEqualTo(@"{""foo"":{""$gte"":42}}"); }
public void TestNot() { var queryToNegate = new MongoQueryBuilder().GreaterOrEquals("foo", 42); var query = _qb.Not(queryToNegate); var result = (Dictionary <string, object>)query.Build()["$not"]; var innerQuery = (Dictionary <string, object>)result["foo"]; Check.That(innerQuery["$gte"]).IsEqualTo(42); }
protected async Task UpdateManyByQuery(MongoQueryBuilder <TEntity, TKey> query) { if (query.Filter == null) { query.Where(x => true); } query.UpdateSet(x => x.UpdateTime, DateTime.UtcNow); await _collection.UpdateManyAsync(query.Filter, query.Update); }
public void TestAddIfNotNull() { MongoQueryBuilder queryBuilder = new MongoQueryBuilder(); queryBuilder.AddIfNotNull("Test Key", "Some Not Null", aString => new BsonString("Test Value")); Assert.AreEqual(1, queryBuilder.Count); queryBuilder.AddIfNotNull<string>("Test Null Key", null, aString => new BsonString(aString)); Assert.AreEqual(1, queryBuilder.Count); }
protected MongoQueryBuilder <AppUser, string> _shortUserProjection(MongoQueryBuilder <AppUser, string> query) => query .ProjectionInclude(x => x.Image) .ProjectionInclude(z => z.Birthday) .ProjectionInclude(z => z.CreateTime) .ProjectionInclude(z => z.Email) .ProjectionInclude(z => z.FirstName) .ProjectionInclude(z => z.Id) .ProjectionInclude(z => z.Isblocked) .ProjectionInclude(z => z.IsEmailConfirmed) .ProjectionInclude(z => z.LastName) .ProjectionInclude(z => z.UpdateTime) .ProjectionInclude(z => z.Status) .ProjectionInclude(z => z.UserName);
public void TestMultipleParams() { var mongoQueryOperations = new Dictionary <MongoOperator, object> { [MongoOperator.GreaterThan] = 42, [MongoOperator.NotIn] = new List <string> { "baz", "bam" } }; var greaterThanQuery = new MongoQueryBuilder().Greater("foo", 42); var notInQuery = new MongoQueryBuilder().NotIn("foo", new List <string> { "baz", "bam" }); var mongoQuery = new MongoQueryBuilder().And(new List <MongoQueryBuilder> { greaterThanQuery, notInQuery }); var query = _qb .Id("012345") .CreatorId("12") .CreatedAt("34") .UpdaterId("56") .UpdatedAt("78") .MongoQuery(mongoQuery) .State(State.Trash) .Properties(new List <string> { "foo", "bar" }) .Limit(42) .Skip(10) .Sort("bam") .Build(); Check.That(query["_id"]).IsEqualTo("012345"); Check.That(query["creatorId"]).IsEqualTo("12"); Check.That(query["createdAt"]).IsEqualTo("34"); Check.That(query["updaterId"]).IsEqualTo("56"); Check.That(query["updatedAt"]).IsEqualTo("78"); Check.That(query["_q"]) .IsEqualTo(@"{""$and"":[{""foo"":{""$gt"":42}},{""foo"":{""$nin"":[""baz"",""bam""]}}]}"); Check.That(query["_st"]).IsEqualTo(State.Trash.Value); Check.That(query["_p"]).IsEqualTo(@"[""foo"",""bar""]"); Check.That(query["_l"]).IsEqualTo("42"); Check.That(query["_sk"]).IsEqualTo("10"); Check.That(query["_s"]).IsEqualTo("bam"); }
public void TestOr() { var values = new List <string> { "bar", "baz", "bam" }; var qb1 = new MongoQueryBuilder().NotIn("foo", values); var qb2 = new MongoQueryBuilder().Equals("foo", "bum"); var queryBuilders = new List <MongoQueryBuilder> { qb1, qb2 }; var globalQuery = _qb.Or(queryBuilders).Build(); var queries = (List <Dictionary <string, object> >)globalQuery["$or"]; var firstQueryOperation = (Dictionary <string, IList>)queries[0]["foo"]; var secondQueryOperation = (string)queries[1]["foo"]; Check.That(firstQueryOperation.Keys.First()).IsEqualTo("$nin"); Check.That(firstQueryOperation["$nin"]).IsEqualTo(values); Check.That(secondQueryOperation).IsEqualTo("bum"); }
protected virtual async Task <TEntity> GetByQueryFirst(MongoQueryBuilder <TEntity, TKey> query) { if (query.Filter == null) { query.Where(x => true); } var fluent = _collection.Find(query.Filter); if (query.Sort != null) { fluent = fluent.Sort(query.Sort).Skip(query.PropertySkip); } if (query.Projection != null) { fluent = fluent.Project <TEntity>(query.Projection); } return(await fluent.FirstOrDefaultAsync()); }
public void Parse_IsValidSimpleRequest_ReturnsRequest() { // TODO: Remove, did for fun, need to remove and put mock // var queryString = "?$select=id,name,parentSkillName&$filter=((not(id%20in%20(%276031351af50caef5fab69886%27))))&$top=20"; var queryString = "?$select=id&$filter=(((id eq '1') or (parentId in ('1234','4554','6687')) or (((value eq 100)) and (not(firstName eq 'firstName')))) and not(name eq 'name' and name eq '1'))&$top=20"; // (startswith(name,'s')) or (contains(name,'s')) // new {find({ "$or" : [{ "_id" : 1 }, { "parentId" : { "$in" : [1234, 4554, 6687] } }, { "value" : { "$gt" : 100 }, "firstName" : { "$ne" : "firstName" } }], "name" : { "$ne" : "name" } }, { "name" : 1 }).sort({ "name" : -1 }).skip(20).limit(20)} queryString = "?$filter=EnumValue eq 'Option2'"; var request = new UriParser().Parse <SampleModel>(queryString); // TODO: Remove, did for fun, need to remove and put mock var collection = new MongoClient("mongodb://localhost:27017").GetDatabase("RetailEasy").GetCollection <BsonDocument>("users"); var mongoQueryBuilder = new MongoQueryBuilder <BsonDocument>(request, collection); // {find({ "$or" : [{ "_id" : "1" }, { "ParentId" : { "$in" : ["1234", "4554", "6687"] } }, { "Value" : 100, "FirstName" : { "$ne" : "firstName" } }], "$nor" : [{ "$and" : [{ "Name" : "name" }, { "Name" : "1" }] }] }, { "Id" : 1 }).skip(0).limit(20)} var mongoQuery = mongoQueryBuilder.Query(); Assert.Pass(); }
protected virtual async Task <IEnumerable <TEntity> > GetByQuery(MongoQueryBuilder <TEntity, TKey> query) { if (query.Filter == null) { query.Where(x => true); } var fluent = _collection.Find(query.Filter); if (query.Sort != null) { fluent = fluent.Sort(query.Sort).Skip(query.PropertySkip).Limit(query.PropertyLimit); } if (query.Projection != null) { fluent = fluent.Project <TEntity>(query.Projection); } return(await fluent.ToListAsync()); }
/// <summary> /// Updates an application with a new originator. /// </summary> /// <param name="applicationId">The application identifier.</param> /// <param name="originator">The originator.</param> /// <returns> /// The updated application. /// </returns> protected override iApply.DataContract.Application DoUpdateOriginator(string applicationId, AuthenticatedApplicationUser originator) { MongoQueryBuilder queryBuilder = new MongoQueryBuilder(); queryBuilder.AddIfNotNull(iApplyDb.Application._ID, applicationId, a => new BsonObjectId(new ObjectId(a))); MongoCollection<BsonDocument> applicationCollection = this.database.GetCollection(iApplyDb.Application._COLLECTION_NAME); BsonDocument document = applicationCollection.FindOne(queryBuilder.ToAndEqQuery()); if (document == null) { return null; } var application = BsonConverter.ConvertToObjectViaJson<iApply.DataContract.Application>(document); application.CreatedBy = originator; application.AssignedTo = originator.Id; application.AssignedToDisplayName = originator.DisplayName; application.ModifiedBy = originator.Id; BsonDocument applicationDocument = BsonConverter.ConvertToBsonViaJson(application); applicationCollection.Save(applicationDocument); return application; }
public virtual async Task <long> Count(MongoQueryBuilder <TEntity, TKey> query) => await _collection.CountDocumentsAsync(query.Filter);
public void Query_IsValidSimpleFilterQuery_ReturnsMongoQuery() { // TODO: Remove, did for fun, need to remove and put mock var userCollection = new MongoClient("mongodb://localhost:27017").GetDatabase("RetailEasy").GetCollection <dynamic>("users"); var users = new MongoQueryBuilder <dynamic>(new Request { Filter = new Filter { Operator = FilterOperator.IsContainedIn, Property = nameof(User.Id), Value = new List <string> { "605c7a184462dbd73abf526b", "606e03712631274332ff562c" } } }, userCollection).Query().ToList(); users = new MongoQueryBuilder <dynamic>(new Request { Select = new List <string> { "Id", "contact1", "name" } }, userCollection).Query().ToList(); // TODO: Remove, did for fun, need to remove and put mock var collection = new MongoClient("mongodb://localhost:27017").GetDatabase("RetailEasy").GetCollection <SampleModel>("sample"); var result = new MongoQueryBuilder <SampleModel>(SampleRequest.NoRequest, collection).Query().ToList(); Assert.AreEqual(result.Count, 1); result = new MongoQueryBuilder <SampleModel>(SampleRequest.NoFilter, collection).Query().ToList(); Assert.AreEqual(result.Count, 1); result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleEq, collection).Query().ToList(); Assert.AreEqual(result.Count, 1); result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleAnd, collection).Query().ToList(); Assert.AreEqual(result.Count, 0); result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleOr, collection).Query().ToList(); Assert.AreEqual(result.Count, 2); result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleCompositeAndOr, collection).Query().ToList(); Assert.AreEqual(result.Count, 1); result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleIn, collection).Query().ToList(); Assert.AreEqual(result.Count, 2); result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleContainsStartsWith, collection).Query().ToList(); Assert.AreEqual(result.Count, 2); result = new MongoQueryBuilder <SampleModel>(SampleRequest.SimpleSort, collection).Query().ToList(); Assert.AreEqual(result.Count, 3); var count = new MongoQueryBuilder <SampleModel>(SampleRequest.PageSizeNull, collection).QueryCount().ToList(); Assert.AreEqual(count, 3); Assert.Pass(); }
public virtual async Task <bool> Any(MongoQueryBuilder <TEntity, TKey> query) => (await Count(query)) > 0;
public virtual async Task <bool> ExistsOne(MongoQueryBuilder <TEntity, TKey> query) => (await Count(query)) == 1;
public void Init() { _qb = new MongoQueryBuilder(); }
/// <summary> /// Retrieves a file called <paramref name="filename" /> uploaded as part of application with /// ID <paramref name="applicationId" />. /// If more than one file with this name exists within the application, a file upload control /// name must be provided to resolve the conflict. /// </summary> /// <param name="applicationId">The ID of the application to get uploaded files from.</param> /// <param name="filename">The filename of the uploaded file.</param> /// <param name="controlName">Optional name of the file upload control, used to resolve filename conflicts.</param> /// <returns> /// A serialisable file with name <paramref name="filename" />. /// </returns> protected override FileSerializable DoGetUploadedFile(string applicationId, string filename, string controlName = null) { MongoQueryBuilder queryBuilder = new MongoQueryBuilder(); queryBuilder.AddIfNotNull(iApplyDb.ApplicationAttachments.APPLICATION_ID, applicationId, aid => new BsonString(aid)); queryBuilder.AddIfNotNull(iApplyDb.ApplicationAttachments.CONTROL_NAME, controlName, cn => new BsonString(cn)); queryBuilder.AddIfNotNull(iApplyDb.ApplicationAttachments.Files.FILE_IDENTIFIER_ABSOLUTE_PATH, filename, fn => new BsonString(fn)); MongoCollection<BsonDocument> fileCollection = this.database.GetCollection(iApplyDb.ApplicationAttachments._COLLECTION_NAME); MongoCursor<BsonDocument> documents = fileCollection.Find(queryBuilder.ToAndEqQuery()); if (!documents.Any()) { throw new FileNotFoundException(string.Format(ExceptionMessages.NoFileFound, filename) + (controlName == null ? string.Empty : string.Format(ExceptionMessages.WithinControl, controlName))); } if (documents.Count() > 1) { throw new Exception(string.Format(ExceptionMessages.MultipleFilesFound, filename)); } BsonDocument fileDoc = documents.First(); BsonArray files = fileDoc[iApplyDb.ApplicationAttachments.FILES].AsBsonArray; BsonValue file = files.First(f => f[iApplyDb.ApplicationAttachments.Files.FILE_IDENTIFIER] == filename); return new FileSerializable(file[iApplyDb.ApplicationAttachments.Files.FILE_IDENTIFIER].AsString, file[iApplyDb.ApplicationAttachments.Files.FILE].AsByteArray); }
/// <summary> /// Gets the user with ID <paramref name="userId" />. /// </summary> /// <param name="userId">The user identifier.</param> /// <returns> /// A user with matching ID <paramref name="userId" />, otherwise <see langword="null" /> /// </returns> protected override User DoGetUser(string userId) { MongoQueryBuilder queryBuilder = new MongoQueryBuilder(); queryBuilder.AddIfNotNull(iApplyDb.UserAccess._ID, userId, uid => new BsonObjectId(new ObjectId(uid))); MongoCollection<BsonDocument> userCollection = this.database.GetCollection(iApplyDb.UserAccess._COLLECTION_NAME); BsonDocument document = userCollection.FindOne(queryBuilder.ToAndEqQuery()); if (document == null) { return null; } return BsonConverter.ConvertToObjectViaJson<User>(document); }