示例#1
0
        public void Change(ObjectId id, UpdateDefinition<BsonDocument> changeDefinition)
        {
            var result = _mongoCollection
                .UpdateOne("{_id:ObjectId(\"" + id + "\")}", changeDefinition);

            if (result.MatchedCount == 0)
            {
                throw new ArgumentException("no document was found with an id of \"" + id + "\"");
            }

            if (result.ModifiedCount == 0)
            {
                throw new ArgumentException("the document was not modified");
            }
        }
示例#2
0
        private static async Task HandleIncomingMessage(Socket socket, int offset, int size)
        {
            try
            {
                if (size <= 0)
                {
                    return;
                }

                using (MemoryStream stream = new MemoryStream(receiveBuffers[socket], offset, size))
                {
                    using (BinaryReader reader = new BinaryReader(stream, Encoding.UTF8, true))
                    {
                        byte messageType = reader.ReadByte();

                        if (messageType == (byte)MessageType.RegisterServer)
                        {
                            Console.WriteLine("[Register] Started");

                            // Parse contract
                            Dictionary <string, ContractValue> contractValues = new Dictionary <string, ContractValue>();
                            int valueCount = reader.ReadInt32();

                            for (int i = 0; i < valueCount; i++)
                            {
                                ulong nameHash = reader.ReadUInt64();

                                ContractType type = (ContractType)reader.ReadByte();

                                if (contracts.TryGetValue(nameHash, out ContractDefinition definition) && definition.Type == type)
                                {
                                    object boxedValue = null;

                                    switch (definition.Type)
                                    {
                                    case ContractType.Int8:
                                        boxedValue = (long)reader.ReadSByte();
                                        break;

                                    case ContractType.Int16:
                                        boxedValue = (long)reader.ReadInt16();
                                        break;

                                    case ContractType.Int32:
                                        boxedValue = (long)reader.ReadInt32();
                                        break;

                                    case ContractType.Int64:
                                        boxedValue = (long)reader.ReadInt32();
                                        break;

                                    case ContractType.UInt8:
                                        boxedValue = (long)reader.ReadByte();
                                        break;

                                    case ContractType.UInt16:
                                        boxedValue = (long)reader.ReadUInt16();
                                        break;

                                    case ContractType.UInt32:
                                        boxedValue = (long)reader.ReadUInt32();
                                        break;

                                    case ContractType.UInt64:
                                        boxedValue = (long)reader.ReadUInt64();
                                        break;

                                    case ContractType.String:
                                        boxedValue = reader.ReadString();
                                        break;

                                    case ContractType.Buffer:
                                        boxedValue = reader.ReadBytes(reader.ReadInt32());
                                        break;

                                    case ContractType.Guid:
                                        boxedValue = new Guid(reader.ReadString());
                                        break;
                                    }

                                    if (boxedValue != null)
                                    {
                                        contractValues.Add(definition.Name, new ContractValue()
                                        {
                                            Definition = definition,
                                            Value      = boxedValue
                                        });
                                    }
                                }
                                else
                                {
                                    switch (type)
                                    {
                                    case ContractType.Int8:
                                        reader.ReadSByte();
                                        break;

                                    case ContractType.Int16:
                                        reader.ReadInt16();
                                        break;

                                    case ContractType.Int32:
                                        reader.ReadInt32();
                                        break;

                                    case ContractType.Int64:
                                        reader.ReadInt32();
                                        break;

                                    case ContractType.UInt8:
                                        reader.ReadByte();
                                        break;

                                    case ContractType.UInt16:
                                        reader.ReadUInt16();
                                        break;

                                    case ContractType.UInt32:
                                        reader.ReadUInt32();
                                        break;

                                    case ContractType.UInt64:
                                        reader.ReadUInt64();
                                        break;

                                    case ContractType.String:
                                        reader.ReadString();
                                        break;

                                    case ContractType.Buffer:
                                        reader.ReadBytes(reader.ReadInt32());
                                        break;

                                    case ContractType.Guid:
                                        reader.ReadString();
                                        break;
                                    }
                                }
                            }

                            // Contract validation, ensure all REQUIRED fields are present
                            for (int i = 0; i < configuration.ServerContract.Length; i++)
                            {
                                if (configuration.ServerContract[i].Required)
                                {
                                    if (!contractValues.TryGetValue(configuration.ServerContract[i].Name, out ContractValue contractValue) || contractValue.Definition.Type != configuration.ServerContract[i].Type)
                                    {
                                        // Failure, contract did not match
                                        using (MemoryStream outStream = new MemoryStream())
                                        {
                                            using (BinaryWriter writer = new BinaryWriter(outStream, Encoding.UTF8, true))
                                            {
                                                writer.Write((byte)MessageType.RegisterAck);
                                                writer.Write(new Guid().ToString());
                                                writer.Write(false);
                                            }

                                            socket.BeginSend(outStream.GetBuffer(), 0, (int)outStream.Length, SocketFlags.None, (e) =>
                                            {
                                                socket.EndSend(e);
                                            }, null);
                                        }

                                        Console.WriteLine("[Register] Registrar broke contract. Missing required field \"" + configuration.ServerContract[i].Name + "\" of type " + configuration.ServerContract[i].Type);
                                        return;
                                    }
                                }
                            }

                            List <ContractValue> validatedValues = new List <ContractValue>();

                            // Remove all fields not part of contract
                            for (int i = 0; i < configuration.ServerContract.Length; i++)
                            {
                                if (contractValues.TryGetValue(configuration.ServerContract[i].Name, out ContractValue contractValue) && contractValue.Definition.Type == configuration.ServerContract[i].Type)
                                {
                                    validatedValues.Add(contractValue);
                                }
                            }

                            // Create model for DB
                            ServerModel server = new ServerModel()
                            {
                                Id           = Guid.NewGuid().ToString(),
                                LastPingTime = DateTime.UtcNow,
                                Address      = ((IPEndPoint)socket.RemoteEndPoint).Address.MapToIPv6(),
                                ContractData = new Dictionary <string, object>()
                            };

                            // Add contract values to model
                            for (int i = 0; i < validatedValues.Count; i++)
                            {
                                server.ContractData.Add(validatedValues[i].Definition.Name, validatedValues[i].Value);
                            }

                            if (configuration.VerbosePrints)
                            {
                                Console.WriteLine("[Register] Adding: " + JsonConvert.SerializeObject(server));
                            }
                            else
                            {
                                Console.WriteLine("[Register] Adding 1 server");
                            }

                            if (configuration.UseMongo)
                            {
                                // Insert model to DB
                                await mongoClient.GetDatabase(configuration.MongoDatabase).GetCollection <ServerModel>("servers").InsertOneAsync(server);
                            }
                            else
                            {
                                localModels.Add(server);
                            }

                            using (MemoryStream outStream = new MemoryStream())
                            {
                                using (BinaryWriter writer = new BinaryWriter(outStream, Encoding.UTF8, true))
                                {
                                    writer.Write((byte)MessageType.RegisterAck);
                                    writer.Write(server.Id);
                                    writer.Write(true);
                                }

                                socket.BeginSend(outStream.GetBuffer(), 0, (int)outStream.Length, SocketFlags.None, (e) =>
                                {
                                    socket.EndSend(e);
                                }, null);
                            }
                        }
                        else if (messageType == (byte)MessageType.Query)
                        {
                            DateTime startTime = DateTime.Now;
                            Console.WriteLine("[Query] Started");
                            string guid  = reader.ReadString();
                            string query = reader.ReadString();
                            Console.WriteLine("[Query] Parsing");
                            JObject parsedQuery = JObject.Parse(query);

                            List <ServerModel> serverModel = null;

                            if (configuration.UseMongo)
                            {
                                Console.WriteLine("[Query] Creating mongo filter");
                                FilterDefinition <ServerModel> filter = Builders <ServerModel> .Filter.And(Builders <ServerModel> .Filter.Where(x => x.LastPingTime >= DateTime.UtcNow.AddMilliseconds(-configuration.ServerTimeout)), QueryParser.CreateFilter(new List <JToken>()
                                {
                                    parsedQuery
                                }));

                                if (configuration.VerbosePrints)
                                {
                                    Console.WriteLine("[Query] Executing mongo query \"" + mongoClient.GetDatabase(configuration.MongoDatabase).GetCollection <ServerModel>("servers").Find(filter) + "\"");
                                }
                                else
                                {
                                    Console.WriteLine("[Query] Executing mongo query");
                                }

                                serverModel = await(await mongoClient.GetDatabase(configuration.MongoDatabase).GetCollection <ServerModel>("servers").FindAsync(filter)).ToListAsync();
                            }
                            else
                            {
                                Console.WriteLine("[Query] Querying local");
                                serverModel = localModels.AsParallel().Where(x => x.LastPingTime >= DateTime.UtcNow.AddMilliseconds(-configuration.ServerTimeout) && QueryParser.FilterLocalServers(new List <JToken>()
                                {
                                    parsedQuery
                                }, x)).ToList();
                            }

                            Console.WriteLine("[Query] Found " + (serverModel == null ? 0 : serverModel.Count) + " results. Total query time: " + (DateTime.Now - startTime).TotalMilliseconds + " ms");

                            using (MemoryStream outStream = new MemoryStream())
                            {
                                using (BinaryWriter writer = new BinaryWriter(outStream, Encoding.UTF8, true))
                                {
                                    writer.Write((byte)MessageType.QueryResponse);
                                    writer.Write(guid);
                                    writer.Write(serverModel.Count);

                                    for (int i = 0; i < serverModel.Count; i++)
                                    {
                                        writer.Write(serverModel[i].Id);
                                        writer.Write(serverModel[i].Address.MapToIPv6().GetAddressBytes());
                                        writer.Write(serverModel[i].LastPingTime.ToBinary());
                                        writer.Write(serverModel[i].ContractData.Count);

                                        foreach (KeyValuePair <string, object> pair in serverModel[i].ContractData)
                                        {
                                            writer.Write(pair.Key);
                                            writer.Write((byte)contracts[pair.Key.GetStableHash64()].Type);

                                            switch (contracts[pair.Key.GetStableHash64()].Type)
                                            {
                                            case ContractType.Int8:
                                                writer.Write((sbyte)(long)pair.Value);
                                                break;

                                            case ContractType.Int16:
                                                writer.Write((short)(long)pair.Value);
                                                break;

                                            case ContractType.Int32:
                                                writer.Write((int)(long)pair.Value);
                                                break;

                                            case ContractType.Int64:
                                                writer.Write((long)pair.Value);
                                                break;

                                            case ContractType.UInt8:
                                                writer.Write((byte)(long)pair.Value);
                                                break;

                                            case ContractType.UInt16:
                                                writer.Write((ushort)(long)pair.Value);
                                                break;

                                            case ContractType.UInt32:
                                                writer.Write((uint)(long)pair.Value);
                                                break;

                                            case ContractType.UInt64:
                                                writer.Write((ulong)(long)pair.Value);
                                                break;

                                            case ContractType.String:
                                                writer.Write((string)pair.Value);
                                                break;

                                            case ContractType.Buffer:
                                                writer.Write(((byte[])pair.Value).Length);
                                                writer.Write((byte[])pair.Value);
                                                break;

                                            case ContractType.Guid:
                                                writer.Write(((Guid)pair.Value).ToString());
                                                break;
                                            }
                                        }
                                    }
                                }

                                socket.BeginSend(outStream.GetBuffer(), 0, (int)outStream.Length, SocketFlags.None, (e) =>
                                {
                                    socket.EndSend(e);
                                }, null);
                            }
                        }
                        else if (messageType == (byte)MessageType.ServerAlive)
                        {
                            Console.WriteLine("[Alive] Started");
                            Guid guid = new Guid(reader.ReadString());

                            if (configuration.VerbosePrints)
                            {
                                Console.WriteLine("[Alive] Parsed from " + guid.ToString());
                            }
                            else
                            {
                                Console.WriteLine("[Alive] Parsed");
                            }

                            if (configuration.UseMongo)
                            {
                                // Find and validate address ownership
                                FilterDefinition <ServerModel> filter = Builders <ServerModel> .Filter.And(Builders <ServerModel> .Filter.Where(x => x.LastPingTime >= DateTime.UtcNow.AddMilliseconds(-configuration.ServerTimeout)), Builders <ServerModel> .Filter.Eq(x => x.Address, ((IPEndPoint)socket.RemoteEndPoint).Address.MapToIPv6()), Builders <ServerModel> .Filter.Eq(x => x.Id, guid.ToString()));

                                // Create update
                                UpdateDefinition <ServerModel> update = Builders <ServerModel> .Update.Set(x => x.LastPingTime, DateTime.UtcNow);

                                // Execute
                                await mongoClient.GetDatabase(configuration.MongoDatabase).GetCollection <ServerModel>("servers").FindOneAndUpdateAsync(filter, update);
                            }
                            else
                            {
                                ServerModel model = localModels.Find(x => x.Address.Equals(((IPEndPoint)socket.RemoteEndPoint).Address.MapToIPv6()) && x.Id == guid.ToString() && x.LastPingTime >= DateTime.UtcNow.AddMilliseconds(-configuration.ServerTimeout));

                                if (model != null)
                                {
                                    model.LastPingTime = DateTime.UtcNow;
                                }
                            }
                        }
                        else if (messageType == (byte)MessageType.RemoveServer)
                        {
                            Console.WriteLine("[Remove] Started");
                            Guid guid = new Guid(reader.ReadString());

                            if (configuration.VerbosePrints)
                            {
                                Console.WriteLine("[Remove] Parsed from " + guid.ToString());
                            }
                            else
                            {
                                Console.WriteLine("[Remove] Parsed");
                            }

                            ServerModel model = null;

                            if (configuration.UseMongo)
                            {
                                // Find and validate address ownership
                                FilterDefinition <ServerModel> filter = Builders <ServerModel> .Filter.And(Builders <ServerModel> .Filter.Where(x => x.LastPingTime >= DateTime.UtcNow.AddMilliseconds(-configuration.ServerTimeout)), Builders <ServerModel> .Filter.Eq(x => x.Address, ((IPEndPoint)socket.RemoteEndPoint).Address.MapToIPv6()), Builders <ServerModel> .Filter.Eq(x => x.Id, guid.ToString()));

                                // Execute
                                model = await mongoClient.GetDatabase(configuration.MongoDatabase).GetCollection <ServerModel>("servers").FindOneAndDeleteAsync(filter);
                            }
                            else
                            {
                                model = localModels.Find(x => x.Id == guid.ToString() && x.Address.Equals(((IPEndPoint)socket.RemoteEndPoint).Address.MapToIPv6()));

                                if (model != null)
                                {
                                    localModels.Remove(model);
                                }
                            }

                            if (model != null)
                            {
                                if (configuration.VerbosePrints)
                                {
                                    Console.WriteLine("[Remove] Removed: " + JsonConvert.SerializeObject(model));
                                }
                                else
                                {
                                    Console.WriteLine("[Remove] Removed 1 element");
                                }
                            }
                            else
                            {
                                Console.WriteLine("[Remove] Not found");
                            }
                        }
                        else if (messageType == (byte)MessageType.UpdateServer)
                        {
                            Console.WriteLine("[Update] Started");
                            Guid guid = new Guid(reader.ReadString());

                            ServerModel result = null;

                            if (configuration.UseMongo)
                            {
                                result = await(await mongoClient.GetDatabase(configuration.MongoDatabase).GetCollection <ServerModel>("servers").FindAsync(x => x.Id == guid.ToString() && x.Address == ((IPEndPoint)socket.RemoteEndPoint).Address.MapToIPv6() && x.LastPingTime >= DateTime.UtcNow.AddMilliseconds(-configuration.ServerTimeout))).FirstOrDefaultAsync();
                            }
                            else
                            {
                                result = localModels.Find(x => x.Id == guid.ToString() && x.Address.Equals(((IPEndPoint)socket.RemoteEndPoint).Address.MapToIPv6()) && x.LastPingTime >= DateTime.UtcNow.AddMilliseconds(-configuration.ServerTimeout));
                            }

                            if (result != null)
                            {
                                // Parse contract
                                Dictionary <string, ContractValue> contractValues = new Dictionary <string, ContractValue>();
                                int valueCount = reader.ReadInt32();

                                for (int i = 0; i < valueCount; i++)
                                {
                                    ulong nameHash = reader.ReadUInt64();

                                    ContractType type = (ContractType)reader.ReadByte();

                                    if (contracts.TryGetValue(nameHash, out ContractDefinition definition) && definition.Type == type)
                                    {
                                        object boxedValue = null;

                                        switch (definition.Type)
                                        {
                                        case ContractType.Int8:
                                            boxedValue = (long)reader.ReadSByte();
                                            break;

                                        case ContractType.Int16:
                                            boxedValue = (long)reader.ReadInt16();
                                            break;

                                        case ContractType.Int32:
                                            boxedValue = (long)reader.ReadInt32();
                                            break;

                                        case ContractType.Int64:
                                            boxedValue = (long)reader.ReadInt64();
                                            break;

                                        case ContractType.UInt8:
                                            boxedValue = (long)reader.ReadByte();
                                            break;

                                        case ContractType.UInt16:
                                            boxedValue = (long)reader.ReadUInt16();
                                            break;

                                        case ContractType.UInt32:
                                            boxedValue = (long)reader.ReadUInt32();
                                            break;

                                        case ContractType.UInt64:
                                            boxedValue = (long)reader.ReadUInt64();
                                            break;

                                        case ContractType.String:
                                            boxedValue = reader.ReadString();
                                            break;

                                        case ContractType.Buffer:
                                            boxedValue = reader.ReadBytes(reader.ReadInt32());
                                            break;

                                        case ContractType.Guid:
                                            boxedValue = new Guid(reader.ReadString());
                                            break;
                                        }

                                        if (boxedValue != null)
                                        {
                                            contractValues.Add(definition.Name, new ContractValue()
                                            {
                                                Definition = definition,
                                                Value      = boxedValue
                                            });
                                        }
                                    }
                                    else
                                    {
                                        switch (type)
                                        {
                                        case ContractType.Int8:
                                            reader.ReadSByte();
                                            break;

                                        case ContractType.Int16:
                                            reader.ReadInt16();
                                            break;

                                        case ContractType.Int32:
                                            reader.ReadInt32();
                                            break;

                                        case ContractType.Int64:
                                            reader.ReadInt64();
                                            break;

                                        case ContractType.UInt8:
                                            reader.ReadByte();
                                            break;

                                        case ContractType.UInt16:
                                            reader.ReadUInt16();
                                            break;

                                        case ContractType.UInt32:
                                            reader.ReadUInt32();
                                            break;

                                        case ContractType.UInt64:
                                            reader.ReadUInt64();
                                            break;

                                        case ContractType.String:
                                            reader.ReadString();
                                            break;

                                        case ContractType.Buffer:
                                            reader.ReadBytes(reader.ReadInt32());
                                            break;

                                        case ContractType.Guid:
                                            reader.ReadString();
                                            break;
                                        }
                                    }
                                }

                                // Contract validation, ensure all REQUIRED fields are present
                                for (int i = 0; i < configuration.ServerContract.Length; i++)
                                {
                                    if (configuration.ServerContract[i].Required)
                                    {
                                        if (!contractValues.TryGetValue(configuration.ServerContract[i].Name, out ContractValue contractValue) || contractValue.Definition.Type != configuration.ServerContract[i].Type)
                                        {
                                            // Failure, contract did not match
                                            return;
                                        }
                                    }
                                }

                                List <ContractValue> validatedValues = new List <ContractValue>();

                                // Remove all fields not part of contract
                                for (int i = 0; i < configuration.ServerContract.Length; i++)
                                {
                                    if (contractValues.TryGetValue(configuration.ServerContract[i].Name, out ContractValue contractValue) && contractValue.Definition.Type == configuration.ServerContract[i].Type)
                                    {
                                        validatedValues.Add(contractValue);
                                    }
                                }

                                Dictionary <string, object> validatedLookupValues = new Dictionary <string, object>();

                                // Add contract values to model
                                for (int i = 0; i < validatedValues.Count; i++)
                                {
                                    validatedLookupValues.Add(validatedValues[i].Definition.Name, validatedValues[i].Value);
                                }

                                if (configuration.UseMongo)
                                {
                                    // Find and validate address ownership
                                    FilterDefinition <ServerModel> filter = Builders <ServerModel> .Filter.And(Builders <ServerModel> .Filter.Where(x => x.LastPingTime >= DateTime.UtcNow.AddMilliseconds(-configuration.ServerTimeout)), Builders <ServerModel> .Filter.Eq(x => x.Address, ((IPEndPoint)socket.RemoteEndPoint).Address.MapToIPv6()), Builders <ServerModel> .Filter.Eq(x => x.Id, guid.ToString()));

                                    // Create update
                                    UpdateDefinition <ServerModel> update = Builders <ServerModel> .Update.Set(x => x.LastPingTime, DateTime.UtcNow).Set(x => x.ContractData, validatedLookupValues);

                                    // Insert model to DB
                                    await mongoClient.GetDatabase(configuration.MongoDatabase).GetCollection <ServerModel>("servers").FindOneAndUpdateAsync(filter, update);
                                }
                                else
                                {
                                    ServerModel model = localModels.Find(x => x.Address.Equals(((IPEndPoint)socket.RemoteEndPoint).Address.MapToIPv6()) && x.Id == guid.ToString() && x.LastPingTime >= DateTime.UtcNow.AddMilliseconds(-configuration.ServerTimeout));
                                    model.LastPingTime = DateTime.UtcNow;
                                    model.ContractData = validatedLookupValues;
                                }
                            }
                        }
                        else if (messageType == (byte)MessageType.ContractCheck)
                        {
                            Console.WriteLine("[ContractCheck] Started");

                            string guid          = reader.ReadString();
                            int    contractCount = reader.ReadInt32();

                            WeakContractDefinition[] remoteContracts = new WeakContractDefinition[contractCount];

                            for (int i = 0; i < contractCount; i++)
                            {
                                remoteContracts[i] = new WeakContractDefinition()
                                {
                                    Name = reader.ReadString(),
                                    Type = (ContractType)reader.ReadByte()
                                };
                            }

                            using (MemoryStream outStream = new MemoryStream())
                            {
                                using (BinaryWriter writer = new BinaryWriter(outStream, Encoding.UTF8, true))
                                {
                                    writer.Write((byte)MessageType.ContractResponse);
                                    writer.Write(guid);
                                    writer.Write(ContractDefinition.IsCompatible(remoteContracts, contracts.Select(x => x.Value).ToArray()));
                                }

                                socket.BeginSend(outStream.GetBuffer(), 0, (int)outStream.Length, SocketFlags.None, (e) =>
                                {
                                    socket.EndSend(e);
                                }, null);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
示例#3
0
 /// <summary>
 /// Takes a document you want to modify and applies the update you have defined in MongoDb.
 /// </summary>
 /// <typeparam name="T">The type representing a Document</typeparam>
 /// <param name="collectionName">Name of collection in db (by default is name of T)</param>
 /// <param name="entityToModify">Db entity of type T</param>
 /// <param name="update">The update definition for the document</param>
 /// <returns></returns>
 public async Task UpdateOneAsync(T entityToModify, UpdateDefinition <T> update) =>
 await DbContext.GetCollection <T>().UpdateOneAsync(x => x.Id.Equals(entityToModify.Id), update);
示例#4
0
 /// <summary>
 /// 更新所有满足条件的所有数据
 /// </summary>
 /// <param name="collectionName">数据集名称</param>
 /// <param name="filter">过滤条件</param>
 /// <param name="update">更新内容</param>
 /// <returns>更新结果</returns>
 public UpdateResult UpdateMany(string collectionName, FilterDefinition <BsonDocument> filter, UpdateDefinition <BsonDocument> update)
 {
     return(GetCollection(collectionName).UpdateMany(filter, update));
 }
 public static bool UpdateField <T>(FilterDefinition <T> filter, UpdateDefinition <T> update) where T : Entity
 {
     return(GetCollection <T>().UpdateOneAsync(filter, update).Result.IsAcknowledged);
 }
示例#6
0
 /// <summary>
 /// 更新角色信息
 /// </summary>
 /// <param name="Query">查询条件</param>
 /// <param name="Update">更新条件</param>
 /// <returns>返回更新结果</returns>
 public UpdateResult UpdateRole(BsonDocument Query, UpdateDefinition<BsonDocument> Update)
 {
     return dh.UpdateData("userroles", Query, Update);
 }
 public static void Update(EmployerSurvey survey, UpdateDefinition<EmployerSurvey> update)
 {
     DBContext.Current.Update<EmployerSurvey>(x => x.id == survey.id, update);
 }
示例#8
0
 public TProjection FindOneAndUpdate <TProjection>(IClientSessionHandle session, FilterDefinition <TDocument> filter, UpdateDefinition <TDocument> update, FindOneAndUpdateOptions <TDocument, TProjection> options = null, CancellationToken cancellationToken = default)
 {
     throw new System.NotImplementedException();
 }
示例#9
0
 public abstract TProjection FindOneAndUpdate <TProjection>(FilterDefinition <TDocument> filter, UpdateDefinition <TDocument> update, FindOneAndUpdateOptions <TDocument, TProjection> options = null, CancellationToken cancellationToken = default(CancellationToken));
示例#10
0
        public virtual async Task <T> ModifyAsync(string correlationId, FilterDefinition <T> filterDefinition, UpdateDefinition <T> updateDefinition)
        {
            if (filterDefinition == null || updateDefinition == null)
            {
                return(default(T));
            }

            var options = new FindOneAndUpdateOptions <T>
            {
                ReturnDocument = ReturnDocument.After,
                IsUpsert       = false
            };

            var result = await _collection.FindOneAndUpdateAsync(filterDefinition, updateDefinition, options);

            _logger.Trace(correlationId, "Modify in {0}", _collectionName);

            return(result);
        }
示例#11
0
 public Task <UpdateResult> UpdateManyAsync(FilterDefinition <TDocument> filter, UpdateDefinition <TDocument> update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken))
 {
     return(Task.FromResult(UpdateMany(filter, update, options, cancellationToken)));
 }
示例#12
0
        /// <summary>
        /// Altera assíncrono o registro na base de dados.
        /// </summary>
        /// <param name="filtro">Expressão LAMBDA.</param>
        /// <param name="registro">Informe o objeto.</param>
        /// <returns>Retorna o registro atualizado.</returns>
        public virtual async Task <T> AlterarAsync(Expression <Func <T, bool> > filtro, UpdateDefinition <T> registro)
        {
            try
            {
                await BuscarAsync(filtro);

                return(await Colecao.FindOneAndUpdateAsync(sessao, filtro, registro, opcaoPadrao));
            }
            catch (Exception)
            {
                throw;
            }
        }
示例#13
0
 public void Update(string id, UpdateDefinition <T> update)
 {
     this.Collection.UpdateOne(t => t.Id == id, update);
 }
示例#14
0
 /// <summary>
 /// 更新数据集中所有数据
 /// </summary>
 /// <param name="collectionName">数据集名称</param>
 /// <param name="update">更新内容</param>
 /// <returns>更新结果</returns>
 public UpdateResult UpdateAll(string collectionName, UpdateDefinition <BsonDocument> update)
 {
     return(GetCollection(collectionName).UpdateMany(new BsonDocument(), update));
 }
示例#15
0
 /// <summary>
 /// 更新案件信息
 /// </summary>
 /// <param name="Query">查询条件</param>
 /// <param name="Update">更新条件</param>
 /// <returns>返回更新结果</returns>
 public UpdateResult UpdateCase(BsonDocument Query, UpdateDefinition<BsonDocument> Update)
 {
     return dh.UpdateData("cases", Query, Update);
 }
示例#16
0
 public UpdateResult UpdateOne(IClientSessionHandle session, FilterDefinition <TDocument> filter, UpdateDefinition <TDocument> update, UpdateOptions options = null, CancellationToken cancellationToken = default)
 {
     throw new System.NotImplementedException();
 }
 public static void Update(PersonalSurvey survey, UpdateDefinition<PersonalSurvey> update)
 {
     DBContext.Current.Update<PersonalSurvey>(x => x.id == survey.id, update);
 }
示例#18
0
 public abstract UpdateResult UpdateMany(FilterDefinition <TDocument> filter, UpdateDefinition <TDocument> update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken));
示例#19
0
 public static void Update(User user, UpdateDefinition<User> update)
 {
     DBContext.Current.Update<User>(x => x.id == user.id, update);
 }
示例#20
0
 public Task <TProjection> FindOneAndUpdateAsync <TProjection>(FilterDefinition <TDocument> filter, UpdateDefinition <TDocument> update, FindOneAndUpdateOptions <TDocument, TProjection> options = null, CancellationToken cancellationToken = default(CancellationToken))
 {
     return(Task.FromResult(FindOneAndUpdate(filter, update, options, cancellationToken)));
 }
 public Task <TProjection> FindOneAndUpdateAsync <TProjection>(IClientSessionHandle session, FilterDefinition <T> filter, UpdateDefinition <T> update, FindOneAndUpdateOptions <T, TProjection> options = null, CancellationToken cancellationToken = default(CancellationToken))
 {
     throw new NotImplementedException();
 }
示例#22
0
        /// <summary>
        /// 修改一条数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="collection">表名</param>
        /// <param name="filter">条件</param>
        /// <param name="update">更新的数据</param>
        /// <param name="upsert">如果它不存在是否插入文档</param>
        /// <returns></returns>
        public string UpdateOne <T>(string collection, Expression <Func <T, Boolean> > filter, UpdateDefinition <T> update, bool upsert)
        {
            UpdateResult result = Database.GetCollection <T>(collection).UpdateOne(filter, update, new UpdateOptions()
            {
                IsUpsert = upsert
            });

            return(result.ToJson());
        }
 public Task <UpdateResult> UpdateOneAsync(IClientSessionHandle session, FilterDefinition <T> filter, UpdateDefinition <T> update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken))
 {
     throw new NotImplementedException();
 }
示例#24
0
        /// <summary>
        /// 修改一条数据
        /// </summary>
        /// <param name="collection">表名</param>
        /// <param name="filter">条件</param>
        /// <param name="update">更新的数据</param>
        /// <param name="upsert">如果它不存在是否插入文档</param>
        /// <returns></returns>
        public async Task <string> UpdateOneAsync(string collection, Expression <Func <BsonDocument, Boolean> > filter, UpdateDefinition <BsonDocument> update, bool upsert)
        {
            UpdateResult result = await Database.GetCollection <BsonDocument>(collection).UpdateOneAsync(filter, update, new UpdateOptions()
            {
                IsUpsert = upsert
            });

            return(result.ToJson());
        }
        private BsonDocument RenderUpdate <TDocument>(UpdateDefinition <TDocument> update)
        {
            var serializer = BsonSerializer.SerializerRegistry.GetSerializer <TDocument>();

            return(update.Render(serializer, BsonSerializer.SerializerRegistry));
        }
示例#26
0
        /// <summary>
        /// 修改文档
        /// </summary>
        /// <param name="collName">集合名称</param>
        /// <param name="filter">修改条件</param>
        /// <param name="update">修改结果</param>
        /// <param name="upsert">是否插入新文档(filter条件满足就更新,否则插入新文档)</param>
        /// <returns></returns>
        public Int64 UpdateMany <T>(String collName, Expression <Func <T, Boolean> > filter, UpdateDefinition <T> update, Boolean upsert = false)
        {
            UpdateResult result = Database.GetCollection <T>(collName).UpdateMany(filter, update, new UpdateOptions {
                IsUpsert = upsert
            });

            return(result.ModifiedCount);
        }
示例#27
0
        public override async Task <UpdateResult> Update(StuffItem item)
        {
            if (item.Id.HasValue) // update
            {
                var updateitem = await Get(item.Id.Value.ToString());

                if (updateitem != null)
                {
                    var builder = Builders <StuffItem> .Update;
                    UpdateDefinition <StuffItem> update = null;

                    // обновляем только те поля, которые изменились
                    if (item.Name?.ToLower() != StuffItem.Undefined)
                    {
                        update = builder.Set(p => p.Name, item.Name);
                    }

                    if (item.Description?.ToLower() != StuffItem.Undefined)
                    {
                        update = update == null
                            ? builder.Set(p => p.Description, item.Description)
                            : update.Set(p => p.Description, item.Description);
                    }

                    if (item.Tags != null && item.Tags.Count > 0)
                    {
                        await Task.Run(() =>
                        {
                            var id = 0;
                            foreach (var tag in item.Tags)
                            {
                                tag.Id      = ++id;
                                tag.StuffId = item.Id.Value;
                            }
                        });

                        update = update == null
                            ? builder.Set(p => p.Tags, item.Tags)
                            : update.Set(p => p.Tags, item.Tags);
                    }

                    if (update != null) //есть, что обновить
                    {
                        var doc = Document;
                        if (doc != null)
                        {
                            return(await doc.UpdateOneAsync(Builders <StuffItem> .Filter.Eq(p => p.Id, item.Id), update));
                        }
                    }
                }
            }
            else //Add new
            {
                if (item.Name?.ToLower() == StuffItem.Undefined)
                {
                    item.Name = null;
                }
                if (item.Description?.ToLower() == StuffItem.Undefined)
                {
                    item.Description = null;
                }

                await Add(item);
            }

            return(null);
        }
示例#28
0
        /// <summary>
        /// 修改多个文档
        /// </summary>
        /// <param name="collName">集合名称</param>
        /// <param name="filter">修改条件</param>
        /// <param name="update">修改结果</param>
        /// <param name="upsert">是否插入新文档(filter条件满足就更新,否则插入新文档)</param>
        /// <returns></returns>
        public async Task <long> UpdateManyAsync(String collName, Expression <Func <BsonDocument, Boolean> > filter, UpdateDefinition <BsonDocument> update, Boolean upsert = false)
        {
            UpdateResult result = await Database.GetCollection <BsonDocument>(collName).UpdateManyAsync(filter, update, new UpdateOptions {
                IsUpsert = upsert
            });

            return(result.ModifiedCount);
        }
示例#29
0
 /// <summary>
 /// Takes a document you want to modify and applies the update you have defined in MongoDb with session
 /// </summary>
 /// <param name="entityToModify"></param>
 /// <param name="update"></param>
 /// <param name="session"></param>
 /// <typeparam name="T"></typeparam>
 /// <returns></returns>
 public async Task UpdateOneAsync(T entityToModify, UpdateDefinition <T> update, IClientSessionHandle session) =>
 await DbContext.GetCollection <T>().UpdateOneAsync(session, x => x.Id.Equals(entityToModify.Id), update);
示例#30
0
        /// <summary>
        /// 修改文档
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="collName">表名</param>
        /// <param name="filter">条件</param>
        /// <param name="update">更新后的数据</param>
        /// <returns></returns>
        public T UpdateOne <T>(String collName, Expression <Func <T, Boolean> > filter, UpdateDefinition <T> update)
        {
            T result = Database.GetCollection <T>(collName).FindOneAndUpdate(filter, update);

            return(result);
        }
示例#31
0
 /// <summary>
 /// 更新邮件地址信息
 /// </summary>
 /// <param name="Query">查询条件</param>
 /// <param name="Update">更新条件</param>
 /// <returns>返回更新结果</returns>
 public UpdateResult UpdateAddress(BsonDocument Query, UpdateDefinition<BsonDocument> Update)
 {
     return dh.UpdateData("MaillAddress", Query, Update);
 }
示例#32
0
        /// <summary>
        /// 修改文档
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="collName">表名</param>
        /// <param name="filter">条件</param>
        /// <param name="update">更新后的数据</param>
        /// <returns></returns>
        public async Task <T> UpdateOneAsync <T>(String collName, Expression <Func <T, Boolean> > filter, UpdateDefinition <T> update)
        {
            T result = await Database.GetCollection <T>(collName).FindOneAndUpdateAsync(filter, update);

            return(result);
        }
示例#33
0
 /// <summary>
 /// 更新昵称信息
 /// </summary>
 /// <param name="Query">查询条件</param>
 /// <param name="Update">更新条件</param>
 /// <returns>返回更新结果</returns>
 public UpdateResult UpdateNickName(BsonDocument Query, UpdateDefinition<BsonDocument> Update)
 {
     return dh.UpdateData("MaillNikeName", Query, Update);
 }
示例#34
0
        /// <summary>
        /// 修改文档
        /// </summary>
        /// <param name="collName">表名</param>
        /// <param name="filter">条件</param>
        /// <param name="update">更新后的Bson数据</param>
        /// <returns></returns>
        public async Task <BsonDocument> UpdateOneAsync(String collName, Expression <Func <BsonDocument, Boolean> > filter, UpdateDefinition <BsonDocument> update)
        {
            BsonDocument result = await Database.GetCollection <BsonDocument>(collName).FindOneAndUpdateAsync(filter, update);

            return(result);
        }
示例#35
0
 /// <summary>
 /// 更新电话数据
 /// </summary>
 /// <param name="Query">查询条件</param>
 /// <param name="Update">更新条件</param>
 /// <returns>返回更新结果</returns>
 public UpdateResult UpdatePhone(BsonDocument Query, UpdateDefinition<BsonDocument> Update)
 {
     return dh.UpdateData("MailPhone", Query, Update);
 }
 public TProjection FindOneAndUpdate <TProjection>(FilterDefinition <T> filter, UpdateDefinition <T> update, FindOneAndUpdateOptions <T, TProjection> options = null, CancellationToken cancellationToken = default(CancellationToken))
 {
     throw new NotImplementedException();
 }
        /// <summary>
        /// InsertManyAsync in the Collection
        /// </summary>
        /// <param name="departmentName"></param>
        /// <param name="headOfDepartmentId"></param>
        async private static void InsertManyAsync(string collectionName, UpdateDefinition<BsonDocument> bsonDocuments, BsonDocument filters)
        {
            IMongoDatabase myDB = Connection();
            IMongoCollection<BsonDocument> collections = myDB.GetCollection<BsonDocument>(collectionName);
            UpdateDefinition<BsonDocument> documentList = bsonDocuments;
            await collections.UpdateManyAsync(filters , documentList);

        }
        public Task <TProjection> FindOneAndUpdateAsync <TProjection>(FilterDefinition <T> filter, UpdateDefinition <T> update, FindOneAndUpdateOptions <T, TProjection> options = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            var id = filter.ToBsonDocument().GetValue("Document").ToBsonDocument().GetValue("_id").ToString();

            if (items.ContainsKey(id))
            {
                // Hardcoded for incrementing Sequence
                var foundItem  = items[id];
                var sourceItem = CloneObject(foundItem) as object;

                var valuePropertyInfo = foundItem.GetType().GetRuntimeProperty("Value");
                var currentValue      = (int)valuePropertyInfo.GetValue(foundItem);
                valuePropertyInfo.SetValue(foundItem, ++currentValue);

                return(Task.FromResult((TProjection)sourceItem));
            }

            return(Task.FromResult((TProjection)(object)null));
        }
示例#39
0
 public static void Update(JobExplorer jobExplorer, UpdateDefinition<JobExplorer> update)
 {
     DBContext.Current.Update<JobExplorer>(x => x.id == jobExplorer.id, update);
 }
 public UpdateResult UpdateOne(FilterDefinition <T> filter, UpdateDefinition <T> update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken))
 {
     throw new NotImplementedException();
 }
示例#41
0
 /// <summary>
 /// 更新角色下用户不具有的权限
 /// </summary>
 /// <param name="Query">查询条件</param>
 /// <param name="Update">跟新条件</param>
 /// <returns>返回更新结果</returns>
 public UpdateResult UpdateUserInRoleWithoutPower(BsonDocument Query, UpdateDefinition<BsonDocument> Update)
 {
     return dh.UpdateData("users", Query, Update);
 }
示例#42
0
 public UpdateResult UpdateContainer(BsonDocument Query, UpdateDefinition<BsonDocument> Update)
 {
     return dh.UpdateData("MailContainer", Query, Update);
 }
示例#43
0
        private void ParseUpdateModel(
            BsonDocument model,
            out FilterDefinition <BsonDocument> filter,
            out UpdateDefinition <BsonDocument> update,
            out List <ArrayFilterDefinition> arrayFilters,
            out BsonValue hint,
            out bool isUpsert)
        {
            arrayFilters = null;
            filter       = null;
            update       = null;
            hint         = null;
            isUpsert     = false;

            foreach (BsonElement argument in model.Elements)
            {
                switch (argument.Name)
                {
                case "arrayFilters":
                    arrayFilters = argument
                                   .Value
                                   .AsBsonArray
                                   .Cast <BsonDocument>()
                                   .Select(x => new BsonDocumentArrayFilterDefinition <BsonValue>(x))
                                   .ToList <ArrayFilterDefinition>();
                    break;

                case "filter":
                    filter = new BsonDocumentFilterDefinition <BsonDocument>(argument.Value.AsBsonDocument);
                    break;

                case "hint":
                    hint = argument.Value;
                    break;

                case "update":
                    switch (argument.Value)
                    {
                    case BsonDocument:
                        update = argument.Value.AsBsonDocument;
                        break;

                    case BsonArray:
                        update = PipelineDefinition <BsonDocument, BsonDocument> .Create(argument.Value.AsBsonArray.Cast <BsonDocument>());

                        break;

                    default:
                        throw new FormatException($"Invalid BulkWrite Update model update argument: '{argument.Value}'.");
                    }
                    break;

                case "upsert":
                    isUpsert = argument.Value.ToBoolean();
                    break;

                default:
                    throw new FormatException($"Invalid BulkWrite Update model argument name: '{argument.Name}'.");
                }
            }
        }
示例#44
-1
 public void SetValue(string name, BsonValue value)
 {
     if(_updateDefinition == null)
     {
         _updateDefinition = Builders<BsonDocument>.Update.Set(name, value);
     }
     else
     {
         _updateDefinition = _updateDefinition.Set(name, value);
     }
 }