/// <summary> /// Query anything that does not return any results /// </summary> /// <param name="query"></param> /// <param name="result"></param> /// <returns></returns> protected CollectionValue Execute(ICompiledQuery query, CollectionValue result) { if (this.Connection != null && this.Connection.State == ConnectionState.Open) { using (IDbCommand command = this.Connection.CreateCommand()) { command.CommandText = query.Compiled.FirstOrDefault(); result.Add(new Affected() { new NumericValue() { Long = command.ExecuteNonQuery() } }); } } return result; }
/// <summary> /// Query a SELECT statement which returns results /// </summary> /// <param name="query"></param> /// <param name="result"></param> /// <returns></returns> protected CollectionValue Read(ICompiledQuery query, CollectionValue result) { if (this.Connection != null && this.Connection.State == ConnectionState.Open) { using (IDbCommand command = this.Connection.CreateCommand()) { command.CommandText = query.Compiled.FirstOrDefault(); using (IDataReader reader = command.ExecuteReader()) { if (reader != null) { while (reader.Read() == true) { DocumentValue row = new DocumentValue(); for (int field = 0; field < reader.FieldCount; field++) { row.Set(reader.GetName(field), reader.GetValue(field)); } result.Add(row); } } } } } return result; }
/// <summary> /// find and update, with upsert. /// </summary> /// <param name="query"></param> /// <param name="result"></param> protected void QueryMerge(ICompiledQuery query, CollectionValue result) { MongoCollection<BsonDocument> collection = this.Database.GetCollection(query.Collections.FirstOrDefault()); ICompiledQuery save = query.Children.FirstOrDefault(child => child.Root is Save); ICompiledQuery modify = query.Children.FirstOrDefault(child => child.Root is Modify); if (save != null && modify != null) { BsonArray conditions = BsonSerializer.Deserialize<BsonArray>(modify.Conditions.FirstOrDefault()); BsonArray assignments = BsonSerializer.Deserialize<BsonArray>(save.Assignments.FirstOrDefault()); BsonArray sortings = BsonSerializer.Deserialize<BsonArray>(modify.Sortings.FirstOrDefault()); QueryDocument queryDocument = new QueryDocument(conditions.First().AsBsonDocument); IMongoSortBy sortByDocument = new SortByDocument(sortings.First().AsBsonDocument); UpdateDocument updateDocument = new UpdateDocument(assignments.First().AsBsonDocument); FindAndModifyResult findAndModifyResult = collection.FindAndModify(queryDocument, sortByDocument, updateDocument, true, true); result.Add(this.ToDocument(findAndModifyResult.ModifiedDocument)); } }
/// <summary> /// Drops a database or collection /// </summary> /// <param name="query"></param> /// <param name="result"></param> protected void QueryDrop(ICompiledQuery query, CollectionValue result) { if (query.Databases.Any() == true && this.Database.Name == query.Databases.FirstOrDefault()) { this.Database.Drop(); result.Add( new Affected() { new NumericValue() { Long = 1 } } ); } else { MongoCollection<BsonDocument> collection = this.Database.GetCollection(query.Collections.FirstOrDefault()); CommandResult commandResult = collection.Drop(); result.Add( new Affected() { new NumericValue() { Long = commandResult.Ok == true ? 1 : 0 } } ); } }
/// <summary> /// Query to remove documents from a collection. /// </summary> /// <param name="query"></param> /// <param name="result"></param> protected void QueryRemove(ICompiledQuery query, CollectionValue result) { MongoCollection<BsonDocument> collection = this.Database.GetCollection(query.Collections.FirstOrDefault()); BsonArray conditions = BsonSerializer.Deserialize<BsonArray>(query.Conditions.FirstOrDefault()); WriteConcernResult writeConcernResult = collection.Remove(new QueryDocument(conditions.First().AsBsonDocument)); result.Add( new Affected() { new NumericValue() { Long = (int)writeConcernResult.DocumentsAffected } } ); }
/// <summary> /// Modify all documents that match a query /// </summary> /// <param name="query"></param> /// <param name="result"></param> protected void QueryModify(ICompiledQuery query, CollectionValue result) { MongoCollection<BsonDocument> collection = this.Database.GetCollection(query.Collections.FirstOrDefault()); BsonArray conditions = BsonSerializer.Deserialize<BsonArray>(query.Conditions.FirstOrDefault()); BsonArray assignments = BsonSerializer.Deserialize<BsonArray>(query.Assignments.FirstOrDefault()); QueryDocument queryDocument = new QueryDocument(conditions.First().AsBsonDocument); UpdateDocument updateDocument = new UpdateDocument(assignments.First().AsBsonDocument); WriteConcernResult writeConcernResult = collection.Update(queryDocument, updateDocument, UpdateFlags.Multi); result.Add( new Affected() { new NumericValue() { Long = (int)writeConcernResult.DocumentsAffected } } ); }