// constructors
 public BulkDeleteOperationArgs(
     string collectionName,
     string databaseName,
     int maxBatchCount,
     int maxBatchLength,
     int maxDocumentSize,
     int maxWireDocumentSize,
     bool isOrdered,
     BsonBinaryReaderSettings readerSettings,
     IEnumerable<DeleteRequest> requests,
     WriteConcern writeConcern,
     BsonBinaryWriterSettings writerSettings)
     : base(
         collectionName,
         databaseName,
         maxBatchCount,
         maxBatchLength,
         maxDocumentSize,
         maxWireDocumentSize,
         isOrdered,
         readerSettings,
         requests.Cast<WriteRequest>(),
         writeConcern,
         writerSettings)
 {
 }
        /// <summary>
        /// Creates a new instance of MongoDatabaseSettings.
        /// </summary>
        /// <param name="databaseName">The name of the database.</param>
        /// <param name="credentials">The credentials to access the database.</param>
        /// <param name="guidRepresentation">The representation for Guids.</param>
        /// <param name="readPreference">The read preference.</param>
        /// <param name="writeConcern">The write concern to use.</param>
        public MongoDatabaseSettings(
            string databaseName,
            MongoCredentials credentials,
            GuidRepresentation guidRepresentation,
            ReadPreference readPreference,
            WriteConcern writeConcern)
        {
            if (databaseName == null)
            {
                throw new ArgumentNullException("databaseName");
            }
            if (databaseName == "admin" && credentials != null && !credentials.Admin)
            {
                throw new ArgumentOutOfRangeException("credentials", "Credentials for the admin database must have the admin flag set to true.");
            }
            if (readPreference == null)
            {
                throw new ArgumentNullException("readPreference");
            }
            if (writeConcern == null)
            {
                throw new ArgumentNullException("writeConcern");
            }

            _databaseName = databaseName;
            _credentials = credentials;
            _guidRepresentation = guidRepresentation;
            _readPreference = readPreference;
            _writeConcern = writeConcern;
        }
		public MongoImpl(MongoServer connection, WriteConcern writeConcern)
		{
			this.writeConcern = writeConcern;
			Helpers.Random.Value.NextBytes(initialValue);
			collection =
				connection.GetDatabase(typeof (SomeDocument).Name).GetCollection<SomeDocument>(typeof (SomeDocument).Name);
		}
 // constructors
 public BulkMixedWriteOperation(
     Action<InsertRequest> assignId,
     bool checkElementNames,
     string collectionName,
     string databaseName,
     int maxBatchCount,
     int maxBatchLength,
     int maxDocumentSize,
     int maxWireDocumentSize,
     bool isOrdered,
     BsonBinaryReaderSettings readerSettings,
     IEnumerable<WriteRequest> requests,
     WriteConcern writeConcern,
     BsonBinaryWriterSettings writerSettings)
 {
     _assignId = assignId;
     _checkElementNames = checkElementNames;
     _collectionName = collectionName;
     _databaseName = databaseName;
     _maxBatchCount = maxBatchCount;
     _maxBatchLength = maxBatchLength;
     _maxDocumentSize = maxDocumentSize;
     _maxWireDocumentSize = maxWireDocumentSize;
     _isOrdered = isOrdered;
     _readerSettings = readerSettings;
     _requests = requests;
     _writeConcern = writeConcern;
     _writerSettings = writerSettings;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="GridFSBucketOptions"/> class.
 /// </summary>
 /// <param name="other">The other <see cref="GridFSBucketOptions.Immutable"/> from which to copy the values.</param>
 public GridFSBucketOptions(GridFSBucketOptions.Immutable other)
 {
     _bucketName = other.BucketName;
     _chunkSizeBytes = other.ChunkSizeBytes;
     _readPreference = other.ReadPreference;
     _writeConcern = other.WriteConcern;
 }
        // constructors
        /// <summary>
        /// Creates a new instance of MongoServerSettings. Usually you would use a connection string instead.
        /// </summary>
        public MongoServerSettings()
        {
            _connectionMode = ConnectionMode.Automatic;
            _connectTimeout = MongoDefaults.ConnectTimeout;
            _credentialsStore = new MongoCredentialsStore();
            _defaultCredentials = null;
            _guidRepresentation = MongoDefaults.GuidRepresentation;
            _ipv6 = false;
            _maxConnectionIdleTime = MongoDefaults.MaxConnectionIdleTime;
            _maxConnectionLifeTime = MongoDefaults.MaxConnectionLifeTime;
            _maxConnectionPoolSize = MongoDefaults.MaxConnectionPoolSize;
            _minConnectionPoolSize = MongoDefaults.MinConnectionPoolSize;
            _readPreference = ReadPreference.Primary;
            _replicaSetName = null;
            _secondaryAcceptableLatency = MongoDefaults.SecondaryAcceptableLatency;
            _servers = new List<MongoServerAddress> { new MongoServerAddress("localhost") };
            _socketTimeout = MongoDefaults.SocketTimeout;
            _useSsl = false;
            _verifySslCertificate = true;
            _waitQueueSize = MongoDefaults.ComputedWaitQueueSize;
            _waitQueueTimeout = MongoDefaults.WaitQueueTimeout;
#pragma warning disable 612, 618
            _writeConcern = MongoDefaults.SafeMode.WriteConcern;
#pragma warning restore
        }
 // constructors
 protected BulkWriteOperationArgs(
     string collectionName,
     string databaseName,
     int maxBatchCount,
     int maxBatchLength,
     int maxDocumentSize,
     int maxWireDocumentSize,
     bool isOrdered,
     BsonBinaryReaderSettings readerSettings,
     IEnumerable<WriteRequest> requests,
     WriteConcern writeConcern,
     BsonBinaryWriterSettings writerSettings)
 {
     _collectionName = collectionName;
     _databaseName = databaseName;
     _maxBatchCount = maxBatchCount;
     _maxBatchLength = maxBatchLength;
     _maxDocumentSize = maxDocumentSize;
     _maxWireDocumentSize = maxWireDocumentSize;
     _isOrdered = isOrdered;
     _readerSettings = readerSettings;
     _requests = requests;
     _writeConcern = writeConcern;
     _writerSettings = writerSettings;
 }
        public void CreateOperation_should_return_expected_result(
            [Values(false, true)]
            bool isCommandSupported)
        {
            var requests = new[] { new CreateIndexRequest(new BsonDocument("x", 1)) };
            var writeConcern = new WriteConcern(1);
            var subject = new CreateIndexesOperation(_collectionNamespace, requests, _messageEncoderSettings)
            {
                WriteConcern = writeConcern
            };
            var serverVersion = Feature.CreateIndexesCommand.SupportedOrNotSupportedVersion(isCommandSupported);

            var result = subject.CreateOperation(serverVersion);

            if (isCommandSupported)
            {
                result.Should().BeOfType<CreateIndexesUsingCommandOperation>();
                var operation = (CreateIndexesUsingCommandOperation)result;
                operation.CollectionNamespace.Should().BeSameAs(_collectionNamespace);
                operation.MessageEncoderSettings.Should().BeSameAs(_messageEncoderSettings);
                operation.Requests.Should().Equal(requests);
                operation.WriteConcern.Should().BeSameAs(writeConcern);
            }
            else
            {
                result.Should().BeOfType<CreateIndexesUsingInsertOperation>();
                var operation = (CreateIndexesUsingInsertOperation)result;
                operation.CollectionNamespace.Should().BeSameAs(_collectionNamespace);
                operation.MessageEncoderSettings.Should().BeSameAs(_messageEncoderSettings);
                operation.Requests.Should().Equal(requests);
            }
        }
 // constructors
 public BulkInsertOperationArgs(
     Action<InsertRequest> assignId,
     bool checkElementNames,
     string collectionName,
     string databaseName,
     int maxBatchCount,
     int maxBatchLength,
     int maxDocumentSize,
     int maxWireDocumentSize,
     bool isOrdered,
     BsonBinaryReaderSettings readerSettings,
     IEnumerable<InsertRequest> requests,
     WriteConcern writeConcern,
     BsonBinaryWriterSettings writerSettings)
     : base(
         collectionName,
         databaseName,
         maxBatchCount,
         maxBatchLength,
         maxDocumentSize,
         maxWireDocumentSize,
         isOrdered,
         readerSettings,
         requests.Cast<WriteRequest>(),
         writeConcern,
         writerSettings)
 {
     _assignId = assignId;
     _checkElementNames = checkElementNames;
 }
Exemple #10
0
		public Impl(MongoServer connection, WriteConcern writeConcern)
		{
			_writeConcern = writeConcern;
			new Random(BitConverter.ToInt32(Guid.NewGuid().ToByteArray().Take(4).ToArray(), 0)).NextBytes(_initialValue);
			_collection =
				connection.GetDatabase(typeof (SomeDocument).Name).GetCollection<SomeDocument>(typeof (SomeDocument).Name);
		}
 public void Constructor_with_string_argument_should_properly_initialize_instance()
 {
     var writeConcern = new WriteConcern("mode");
     writeConcern.FSync.Should().NotHaveValue();
     writeConcern.Journal.Should().NotHaveValue();
     writeConcern.W.Should().Be((WriteConcern.WValue)"mode");
     writeConcern.WTimeout.Should().NotHaveValue();
 }
 public void Constructor_with_no_arguments_should_properly_initialize_instance()
 {
     var writeConcern = new WriteConcern();
     writeConcern.FSync.Should().NotHaveValue();
     writeConcern.Journal.Should().NotHaveValue();
     writeConcern.W.Should().BeNull();
     writeConcern.WTimeout.Should().NotHaveValue();
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="GridFSBucketOptions"/> class.
 /// </summary>
 /// <param name="other">The other <see cref="ImmutableGridFSBucketOptions"/> from which to copy the values.</param>
 public GridFSBucketOptions(ImmutableGridFSBucketOptions other)
 {
     Ensure.IsNotNull(other, nameof(other));
     _bucketName = other.BucketName;
     _chunkSizeBytes = other.ChunkSizeBytes;
     _readConcern = other.ReadConcern;
     _readPreference = other.ReadPreference;
     _writeConcern = other.WriteConcern;
 }
 public void Constructor_with_four_arguments_should_properly_initialize_instance(int? w, int? wTimeoutSeconds, bool? fsync, bool? journal)
 {
     var wCount = w.HasValue ? (WriteConcern.WValue)w.Value : null;
     var wTimeout = wTimeoutSeconds.HasValue ? (TimeSpan?)TimeSpan.FromSeconds(wTimeoutSeconds.Value) : null;
     var writeConcern = new WriteConcern(wCount, wTimeout, fsync, journal);
     writeConcern.W.Should().Be(wCount);
     writeConcern.WTimeout.Should().Be(wTimeout);
     writeConcern.FSync.Should().Be(fsync);
     writeConcern.Journal.Should().Be(journal);
 }
 protected WriteOpcodeOperationBase(
     string databaseName,
     string collectionName,
     BsonBinaryReaderSettings readerSettings,
     BsonBinaryWriterSettings writerSettings,
     WriteConcern writeConcern)
     : base(databaseName, collectionName, readerSettings, writerSettings)
 {
     _writeConcern = writeConcern;
 }
        public override WriteConcernResult Save(BsonDocument document, WriteConcern writeConcern, bool needResult)
        {
            // copy, make id, override
            document = CloneExternalDocument(document);
            var id = document.EnsureId();
            bool updatedExisting = _data.ContainsKey(id);
            _data[id] = document;

            return needResult ? new WriteConcernResult(NewResponse(1, updatedExisting, null, null)) : null;
        }
        public void constructor_with_journal_should_initialize_instance(
            [Values(false, true, null)]
            bool? journal)
        {
            var result = new WriteConcern(journal: journal);

            result.FSync.Should().NotHaveValue();
            result.Journal.Should().Be(journal);
            result.W.Should().BeNull();
            result.WTimeout.Should().NotHaveValue();
        }
 // constructors
 public DeleteWireProtocol(
     CollectionNamespace collectionNamespace,
     BsonDocument query,
     bool isMulti,
     MessageEncoderSettings messageEncoderSettings,
     WriteConcern writeConcern)
     : base(collectionNamespace, messageEncoderSettings, writeConcern)
 {
     _query = Ensure.IsNotNull(query, "query");
     _isMulti = isMulti;
 }
 public void Setup()
 {
     Db.GetCollection<ParentEntity>().Drop();
     Db.GetCollection<Entity>().Drop();
     Db.EnsureIndexes();
     _writeConcern = new WriteConcern
     {
         W = WriteConcern.Acknowledged.W,
         Journal = true
     };
 }
 // constructors
 public DeleteWireProtocol(
     string databaseName,
     string collectionName,
     WriteConcern writeConcern,
     BsonDocument query,
     bool isMulti)
     : base(databaseName, collectionName, writeConcern)
 {
     _query = Ensure.IsNotNull(query, "query");
     _isMulti = isMulti;
 }
        protected WriteConcernResult SendMessageWithWriteConcern(
            MongoConnection connection,
            BsonBuffer buffer,
            int requestId,
            BsonBinaryReaderSettings readerSettings,
            BsonBinaryWriterSettings writerSettings,
            WriteConcern writeConcern)
        {
            CommandDocument getLastErrorCommand = null;
            if (writeConcern.Enabled)
            {
                var fsync = (writeConcern.FSync == null) ? null : (BsonValue)writeConcern.FSync;
                var journal = (writeConcern.Journal == null) ? null : (BsonValue)writeConcern.Journal;
                var w = (writeConcern.W == null) ? null : writeConcern.W.ToGetLastErrorWValue();
                var wTimeout = (writeConcern.WTimeout == null) ? null : (BsonValue)(int)writeConcern.WTimeout.Value.TotalMilliseconds;

                getLastErrorCommand = new CommandDocument
                {
                    { "getlasterror", 1 }, // use all lowercase for backward compatibility
                    { "fsync", fsync, fsync != null },
                    { "j", journal, journal != null },
                    { "w", w, w != null },
                    { "wtimeout", wTimeout, wTimeout != null }
                };

                // piggy back on network transmission for message
                var getLastErrorMessage = new MongoQueryMessage(writerSettings, DatabaseName + ".$cmd", QueryFlags.None, 0, 1, getLastErrorCommand, null);
                getLastErrorMessage.WriteToBuffer(buffer);
            }

            connection.SendMessage(buffer, requestId);

            WriteConcernResult writeConcernResult = null;
            if (writeConcern.Enabled)
            {
                var writeConcernResultSerializer = BsonSerializer.LookupSerializer(typeof(WriteConcernResult));
                var replyMessage = connection.ReceiveMessage<WriteConcernResult>(readerSettings, writeConcernResultSerializer, null);
                if (replyMessage.NumberReturned == 0)
                {
                    throw new MongoCommandException("Command 'getLastError' failed. No response returned");
                }
                writeConcernResult = replyMessage.Documents[0];
                writeConcernResult.Command = getLastErrorCommand;

                var mappedException = ExceptionMapper.Map(writeConcernResult);
                if (mappedException != null)
                {
                    throw mappedException;
                }
            }

            return writeConcernResult;
        }
 public RemoveOperation(
     string databaseName,
     string collectionName,
     BsonBinaryReaderSettings readerSettings,
     BsonBinaryWriterSettings writerSettings,
     WriteConcern writeConcern,
     IMongoQuery query,
     RemoveFlags flags)
     : base(databaseName, collectionName, readerSettings, writerSettings, writeConcern)
 {
     _query = query;
     _flags = flags;
 }
        public void constructor_with_mode_and_fsync_should_initialize_instance(
            [Values("abc", "def")]
            string mode,
            [Values(false, true, null)]
            bool? fsync)
        {
            var result = new WriteConcern(mode, fsync: fsync);

            result.FSync.Should().Be(fsync);
            result.Journal.Should().NotHaveValue();
            result.W.Should().Be(new WriteConcern.WMode(mode));
            result.WTimeout.Should().NotHaveValue();
        }
        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            WriteConcern writeConcern;

            if (value is string)
            {
                switch (((string)value).ToUpper())
                {
                    case "ACKNOWLEDGED":
                        writeConcern = WriteConcern.Acknowledged;
                        break;
                    case "NONE":
                    case "UNACKNOWLEDGED":
                        writeConcern = WriteConcern.Unacknowledged;
                        break;
                    case "JOURNALED":
                        writeConcern = new WriteConcern { W = 0, Journal = true };
                        break;
                    case "FSYNCED":
                        writeConcern = new WriteConcern { W = 0, FSync = true };
                        break;
                    case "WMAJORITY":
                        writeConcern = WriteConcern.WMajority;
                        break;
                    case "NORMAL":
                        writeConcern = new WriteConcern { W = 0 };
                        break;
                    case "W2":
                        writeConcern = WriteConcern.W2;
                        break;
                    case "W3":
                        writeConcern = WriteConcern.W3;
                        break;
                    case "W4":
                        writeConcern = WriteConcern.W4;
                        break;
                    default:
                        throw new InvalidOperationException(string.Format("'{0}' is not a supported WriteConcern mode.", value));
                }
            }
            else if (value is bool)
            {
                writeConcern = ((bool)value) ? WriteConcern.Acknowledged : WriteConcern.Unacknowledged;
            }
            else
            {
                throw new InvalidOperationException(string.Format("Object value must be string or bool but is {0}", value.GetType().Name));
            }

            return writeConcern;
        }
        public void CreateCollection_should_execute_the_CreateCollectionOperation_when_options_is_generic(
            [Values(false, true)] bool async)
        {
            var storageEngine = new BsonDocument("awesome", true);
            var options = new CreateCollectionOptions<BsonDocument>
            {
                AutoIndexId = false,
                Capped = true,
                Collation = new Collation("en_US"),
                IndexOptionDefaults = new IndexOptionDefaults { StorageEngine = new BsonDocument("x", 1) },
                MaxDocuments = 10,
                MaxSize = 11,
                StorageEngine = storageEngine,
                UsePowerOf2Sizes = false,
                ValidationAction = DocumentValidationAction.Warn,
                ValidationLevel = DocumentValidationLevel.Off,
                Validator = new BsonDocument("x", 1)
            };
            var writeConcern = new WriteConcern(1);
            var subject = _subject.WithWriteConcern(writeConcern);

            if (async)
            {
                subject.CreateCollectionAsync("bar", options, CancellationToken.None).GetAwaiter().GetResult();
            }
            else
            {
                subject.CreateCollection("bar", options, CancellationToken.None);
            }

            var call = _operationExecutor.GetWriteCall<BsonDocument>();

            call.Operation.Should().BeOfType<CreateCollectionOperation>();
            var op = (CreateCollectionOperation)call.Operation;
            op.CollectionNamespace.Should().Be(new CollectionNamespace(new DatabaseNamespace("foo"), "bar"));
            op.AutoIndexId.Should().Be(options.AutoIndexId);
            op.Capped.Should().Be(options.Capped);
            op.Collation.Should().BeSameAs(options.Collation);
            op.IndexOptionDefaults.ToBsonDocument().Should().Be(options.IndexOptionDefaults.ToBsonDocument());
            op.MaxDocuments.Should().Be(options.MaxDocuments);
            op.MaxSize.Should().Be(options.MaxSize);
            op.StorageEngine.Should().Be(storageEngine);
            op.UsePowerOf2Sizes.Should().Be(options.UsePowerOf2Sizes);
            op.ValidationAction.Should().Be(options.ValidationAction);
            op.ValidationLevel.Should().Be(options.ValidationLevel);
            var serializerRegistry = options.SerializerRegistry ?? BsonSerializer.SerializerRegistry;
            var documentSerializer = options.DocumentSerializer ?? serializerRegistry.GetSerializer<BsonDocument>();
            var renderedValidator = options.Validator.Render(documentSerializer, serializerRegistry);
            op.Validator.Should().Be(renderedValidator);
            op.WriteConcern.Should().BeSameAs(writeConcern);
        }
 // constructors
 public UpdateWireProtocol(
     string databaseName,
     string collectionName,
     WriteConcern writeConcern,
     BsonDocument query,
     BsonDocument update,
     bool isMulti,
     bool isUpsert)
     : base(databaseName, collectionName, writeConcern)
 {
     _query = Ensure.IsNotNull(query, "query");
     _update = Ensure.IsNotNull(update, "update");
     _isMulti = isMulti;
     _isUpsert = isUpsert;
 }
        protected override bool TrySetArgument(string name, BsonValue value)
        {
            switch (name)
            {
                case "requests":
                    _requests = ParseRequests((BsonArray)value).ToList();
                    return true;
                case "ordered":
                    _options.IsOrdered = value.ToBoolean();
                    return true;
                case "writeConcern":
                    _writeConcern = WriteConcern.FromBsonDocument((BsonDocument)value);
                    return true;
            }

            return false;
        }
 // constructors
 public UpdateWireProtocol(
     CollectionNamespace collectionNamespace,
     MessageEncoderSettings messageEncoderSettings,
     WriteConcern writeConcern,
     BsonDocument query,
     BsonDocument update,
     IElementNameValidator updateValidator,
     bool isMulti,
     bool isUpsert)
     : base(collectionNamespace, messageEncoderSettings, writeConcern)
 {
     _updateValidator = Ensure.IsNotNull(updateValidator, nameof(updateValidator));
     _query = Ensure.IsNotNull(query, nameof(query));
     _update = Ensure.IsNotNull(update, nameof(update));
     _isMulti = isMulti;
     _isUpsert = isUpsert;
 }
        protected override bool TrySetArgument(string name, BsonValue value)
        {
            switch (name)
            {
                case "documents":
                    _documents = ((BsonArray)value).OfType<BsonDocument>();
                    return true;
                case "ordered":
                    _options.IsOrdered = value.ToBoolean();
                    return true;
                case "writeConcern":
                    _writeConcern = WriteConcern.FromBsonDocument((BsonDocument)value);
                    return true;
            }

            return false;
        }
 public static WriteConcernResult ModifyAll <TEntity>(this IRepository commandRepository, ISpecificationQueryStrategy <TEntity> specificationStrategy, WriteConcern writeConcern, IMongoUpdate mongoUpdate) where TEntity : class
 {
     return(_DefaultImplementation.ModifyAll <TEntity>(commandRepository, specificationStrategy, writeConcern, mongoUpdate));
 }
Exemple #31
0
 public override IMongoCollection <TDerivedDocument> WithWriteConcern(WriteConcern writeConcern)
 {
     return(new OfTypeMongoCollection <TRootDocument, TDerivedDocument>(_rootDocumentCollection, WrappedCollection.WithWriteConcern(writeConcern), Filter));
 }
Exemple #32
0
        private IClientSessionHandle CreateSession(BsonDocument entity, Dictionary <string, DisposableMongoClient> clients)
        {
            IMongoClient         client  = null;
            ClientSessionOptions options = null;

            foreach (var element in entity)
            {
                switch (element.Name)
                {
                case "id":
                    // handled on higher level
                    break;

                case "client":
                    var clientId = element.Value.AsString;
                    client = clients[clientId];
                    break;

                case "sessionOptions":
                    options = new ClientSessionOptions();
                    foreach (var option in element.Value.AsBsonDocument)
                    {
                        switch (option.Name)
                        {
                        case "causalConsistency":
                            options.CausalConsistency = option.Value.ToBoolean();
                            break;

                        case "defaultTransactionOptions":
                            ReadConcern    readConcern    = null;
                            ReadPreference readPreference = null;
                            WriteConcern   writeConcern   = null;
                            foreach (var transactionOption in option.Value.AsBsonDocument)
                            {
                                switch (transactionOption.Name)
                                {
                                case "readConcern":
                                    readConcern = ReadConcern.FromBsonDocument(transactionOption.Value.AsBsonDocument);
                                    break;

                                case "readPreference":
                                    readPreference = ReadPreference.FromBsonDocument(transactionOption.Value.AsBsonDocument);
                                    break;

                                case "writeConcern":
                                    writeConcern = WriteConcern.FromBsonDocument(transactionOption.Value.AsBsonDocument);
                                    break;

                                default:
                                    throw new FormatException($"Invalid session transaction option: '{transactionOption.Name}'.");
                                }
                            }
                            options.DefaultTransactionOptions = new TransactionOptions(readConcern, readPreference, writeConcern);
                            break;

                        default:
                            throw new FormatException($"Unrecognized session option: '{option.Name}'.");
                        }
                    }
                    break;

                default:
                    throw new FormatException($"Unrecognized database entity field: '{element.Name}'.");
                }
            }

            var session = client.StartSession(options);

            return(session);
        }
Exemple #33
0
 public IMongoClient WithWriteConcern(WriteConcern writeConcern)
 {
     return(this);
 }
 /// <inheritdoc/>
 public IMongoDatabase WithWriteConcern(WriteConcern writeConcern)
 {
     return(_configuration.Database.WithWriteConcern(writeConcern));
 }
Exemple #35
0
        public static void CRUD()
        {
            var exp = ExpressionMapper.MapExp <StudentVm, Student>();

            #region 连接Mongodb
            var client = new MongoClient("mongodb://localhost:27017");

            var database = client.GetDatabase("school");

            #endregion

            #region 约束 驼峰命名法

            var pack = new ConventionPack();
            pack.Add(new CamelCaseElementNameConvention());
            ConventionRegistry.Register("CamelCaseElementNameConvention", pack, t => true);

            #endregion

            #region 1.插入数据

            var collection = database.GetCollection <Student>("student");
            if (collection.CountDocuments(a => true) == 0)
            {
                collection.InsertOne(new Student()
                {
                    Age      = 27,
                    Name     = "zhangsan",
                    Address  = "河南",
                    Birthday = DateTime.Parse("1992-06-17 12:35:12"),
                    Hobbies  = new[] { "阅读", "跑步", },
                    Courses  = new List <Course>()
                    {
                        new Course()
                        {
                            Name  = "计算机理论",
                            Count = 30
                        },
                        new Course()
                        {
                            Name  = "操作系统",
                            Count = 35
                        }
                    }
                });

                collection.InsertOne(new Student()
                {
                    Age      = 23,
                    Name     = "lisi",
                    Address  = "北京",
                    Birthday = DateTime.Parse("1996-05-17 14:40:08"),
                    Hobbies  = new[] { "游戏", "睡觉", "代码" },
                    Courses  = new List <Course>()
                    {
                        new Course()
                        {
                            Name  = "c#语言基础",
                            Count = 30
                        },
                        new Course()
                        {
                            Name  = "编译原理",
                            Count = 35
                        }
                    }
                });

                var bulkList = new List <Student>()
                {
                    new Student()
                    {
                        Age      = 26,
                        Name     = "wangwu",
                        Address  = "河北",
                        Birthday = DateTime.Parse("1993-08-17 16:40:08"),
                        Hobbies  = new[] { "睡觉" },
                        Courses  = new List <Course>()
                        {
                            new Course()
                            {
                                Name  = "网络编程",
                                Count = 30
                            },
                            new Course()
                            {
                                Name  = "操作系统",
                                Count = 35
                            }
                        }
                    },
                    new Student()
                    {
                        Age      = 29,
                        Name     = "wangwu",
                        Address  = "南京",
                        Birthday = DateTime.Parse("1990-05-17 14:40:08"),
                        Hobbies  = new[] { "游戏", "睡觉", "代码", "逛街" },
                        Courses  = new List <Course>()
                        {
                            new Course()
                            {
                                Name  = "网络编程",
                                Count = 30
                            },
                            new Course()
                            {
                                Name  = "操作系统",
                                Count = 35
                            }
                        }
                    }
                };

                collection.InsertMany(bulkList);
            }



            #endregion

            Console.WriteLine();

            #region 2.过滤器(Filter)
            Console.WriteLine("==============过滤==============");

            //空过滤器匹配全部
            FilterDefinition <BsonDocument> filter0 = Builders <BsonDocument> .Filter.Empty;

            //一般匹配
            FilterDefinition <BsonDocument> filter1 = "{name:'zhangsan'}";
            FilterDefinition <BsonDocument> filter2 = new BsonDocument("name", "zhangsan");

            var builder3 = Builders <BsonDocument> .Filter;
            var filter3  = builder3.Eq("name", "zhangsan") & builder3.Gt("age", 10);


            var builder4 = Builders <Student> .Filter;
            var filter4  = (builder4.Eq("name", "zhangsan") & builder4.Gt(a => a.Age, 10)) | builder4.Gt(a => a.Birthday, DateTime.Parse("1990-01-01"));



            var query21   = database.GetCollection <BsonDocument>("student").Find(filter1);
            var json21    = query21.ToString();
            var student21 = query21.FirstOrDefault();
            Console.WriteLine(json21);

            var query22   = database.GetCollection <BsonDocument>("student").Find(filter2);
            var json22    = query22.ToString();
            var student22 = query22.FirstOrDefault();
            Console.WriteLine(json22);


            var query23   = database.GetCollection <BsonDocument>("student").Find(filter3);
            var json23    = query23.ToString();
            var student23 = query23.FirstOrDefault();
            Console.WriteLine(json23);


            var query24   = database.GetCollection <Student>("student").Find(filter4);
            var json24    = query24.ToString();
            var student24 = query24.FirstOrDefault();
            Console.WriteLine(json24);


            //数组匹配
            var builder5 = Builders <BsonDocument> .Filter;
            var filter25 = builder5.AnyEq("courses.name", "操作系统");

            var query25   = database.GetCollection <BsonDocument>("student").Find(filter25);
            var json25    = query25.ToString();
            var student25 = database.GetCollection <BsonDocument>("student").Find(filter25).ToList();
            Console.WriteLine(json25);


            var builder6  = Builders <Student> .Filter;
            var filter26  = builder6.ElemMatch(a => a.Courses, a => a.Name == "操作系统");
            var query26   = database.GetCollection <Student>("student").Find(filter26);
            var json26    = query26.ToString();
            var student26 = database.GetCollection <Student>("student").Find(filter26).ToList();
            Console.WriteLine(json26);


            var builder7  = Builders <Student> .Filter;
            var filter27  = builder7.ElemMatch(a => a.Courses, a => a.Name == "操作系统") & builder7.ElemMatch(a => a.Courses, a => a.Count > 30);
            var query27   = database.GetCollection <Student>("student").Find(filter27);
            var json27    = query27.ToString();
            var student27 = database.GetCollection <Student>("student").Find(filter27).ToList();
            Console.WriteLine(json27);



            var builder8  = Builders <Student> .Filter;
            var filter28  = builder8.ElemMatch(a => a.Courses, a => a.Name == "操作系统") | builder8.ElemMatch(a => a.Courses, a => a.Count > 30);
            var query28   = database.GetCollection <Student>("student").Find(filter28);
            var json28    = query28.ToString();
            var student28 = database.GetCollection <Student>("student").Find(filter28).ToList();
            Console.WriteLine(json28);



            var builder9  = Builders <Student> .Filter;
            var filter29  = builder9.SizeGte(a => a.Hobbies, 4);
            var query29   = database.GetCollection <Student>("student").Find(filter29);
            var json29    = query29.ToString();
            var student29 = database.GetCollection <Student>("student").Find(filter29).ToList();
            Console.WriteLine(json29);



            var builder10  = Builders <Student> .Filter;
            var filter210  = builder10.In(a => a.Name, new[] { "zhangsan", "wangwu" });
            var query210   = database.GetCollection <Student>("student").Find(filter210);
            var json210    = query210.ToString();
            var student210 = database.GetCollection <Student>("student").Find(filter210).ToList();
            Console.WriteLine(json210);



            var builder11  = Builders <Student> .Filter;
            var filter211  = builder11.AnyEq(a => a.Hobbies, "睡觉");
            var query211   = database.GetCollection <Student>("student").Find(filter211);
            var json211    = query211.ToString();
            var student211 = database.GetCollection <Student>("student").Find(filter211).ToList();
            Console.WriteLine(json211);


            var builder12  = Builders <Student> .Filter;
            var filter212  = builder12.Regex(a => a.Name, "ng");
            var query212   = database.GetCollection <Student>("student").Find(filter212);
            var json212    = query212.ToString();
            var student212 = database.GetCollection <Student>("student").Find(filter212).ToList();
            Console.WriteLine(json212);



            var indexes = database.GetCollection <Student>("student").Indexes;

            var indexKey = Builders <Student> .IndexKeys.Text(a => a.Name);

            var model = new CreateIndexModel <Student>(indexKey);
            indexes.CreateOne(model);

            var list = indexes.List().ToList();

            var builder13  = Builders <Student> .Filter;
            var filter213  = builder13.Text("zhangsan");
            var query213   = database.GetCollection <Student>("student").Find(filter213);
            var json213    = query213.ToString();
            var student213 = database.GetCollection <Student>("student").Find(filter213).ToList();
            Console.WriteLine(json213);

            Console.WriteLine("==============过滤==============");

            #endregion

            Console.WriteLine();

            #region 3.投影(Projections)

            Console.WriteLine("==============投影==============");

            ProjectionDefinition <BsonDocument> projection1 = "{age:1}";
            ProjectionDefinition <BsonDocument> projection2 = new BsonDocument("age", 1);

            var json31 = projection1.RenderToBsonDocument();

            var students31 = database.GetCollection <BsonDocument>("student").Find(a => true).Project(projection1).ToList();


            Console.WriteLine(json31);

            var projection3 = Builders <Student> .Projection.Include(a => a.Age).Include(a => a.Name);

            var projection4 = Builders <Student> .Projection.Exclude(a => a.Id).Exclude(a => a.Courses);

            var projection5 = Builders <Student> .Projection.Exclude(a => a.Id);

            var query33    = database.GetCollection <Student>("student").Find(a => true).Project <Student>(projection3);
            var json33     = query33.ToString();
            var students33 = query33.ToList();
            Console.WriteLine(json33);

            var query34    = database.GetCollection <Student>("student").Find(a => true).Project <Student>(projection4);
            var json34     = query34.ToString();
            var students34 = query34.ToList();
            Console.WriteLine(json34);

            var query35    = database.GetCollection <Student>("student").Find(a => true).Project <Student>(projection5);
            var json35     = query35.ToString();
            var students35 = query35.ToList();
            Console.WriteLine(json35);

            var projection6 = Builders <Student> .Projection.Expression(a => new StudentVm()
            {
                Age  = a.Age,
                Id   = a.Id,
                Name = a.Name
            });

            var query36    = database.GetCollection <Student>("student").Find(a => true).Project(projection6);
            var json36     = query36.ToString();
            var students36 = query36.ToList();
            Console.WriteLine(json36);


            var students37 = database.GetCollection <Student>("student").Find(a => true).Project(a => new StudentVm
            {
                Age  = a.Age,
                Id   = a.Id,
                Name = a.Name
            }).ToList();


            var query38 = database.GetCollection <Student>("student").Find(a => true).Project(a => new
            {
                a.Age,
                a.Id,
                a.Name
            });
            var json38     = query38.ToString();
            var students38 = query38.ToList();
            Console.WriteLine(json38);



            var query39 = database.GetCollection <Student>("student").Find(a => true).Project(a => new
            {
                AgeAndName = a.Name + "," + a.Age.ToString()
            });
            var json39     = query39.ToString();
            var students39 = query39.ToList();
            Console.WriteLine(json39);



            //自动投影 根据StudentVm中的属性自动生成
            var query310 = database.GetCollection <Student>("student").Find(a => true).Project(ExpressionMapper.MapExp <Student, StudentVm>());
            var json310  = query310.ToString();
            var listss   = query310.ToList();
            Console.WriteLine($"自动投影:{json310}");

            Console.WriteLine("==============投影==============");

            #endregion

            Console.WriteLine();

            #region 4.排序(Sort)
            Console.WriteLine("==============排序==============");

            SortDefinition <BsonDocument> sort1 = "{ age: 1 }";

            SortDefinition <BsonDocument> sort2 = Builders <BsonDocument> .Sort.Ascending("_id").Descending("age");

            SortDefinition <Student> sort3 = Builders <Student> .Sort.Ascending(a => a.Id).Descending(a => a.Age);

            var query41   = database.GetCollection <Student>("student").Find(new BsonDocument()).Sort(sort3);
            var json41    = query41.ToString();
            var student41 = query41.ToList();
            Console.WriteLine(json41);
            Console.WriteLine("==============排序==============");

            #endregion

            Console.WriteLine();

            #region 5.更新(Update)

            Console.WriteLine("==============更新==============");


            UpdateDefinition <BsonDocument> update1 = "{ $set: { age: 25 } }";

            UpdateDefinition <BsonDocument> update2 = new BsonDocument("$set", new BsonDocument("age", 1));

            //数组更新添加
            var updateBuilder = Builders <Student> .Update;
            UpdateDefinition <Student> update3 = updateBuilder
                                                 .Set(a => a.Name, "修改名称")
                                                 .Set(a => a.Age, 25)
                                                 .Push(a => a.Hobbies, "购物")
                                                 .PushEach(a => a.Courses, new List <Course>()
            {
                new Course()
                {
                    Name  = "马克思主义理论基础",
                    Count = 10,
                },
                new Course()
                {
                    Name  = "毛泽东思想概论",
                    Count = 10,
                }
            })
                                                 .CurrentDate(a => a.Birthday, UpdateDefinitionCurrentDateType.Date);

            var json53    = update3.RenderToBsonDocument();
            var student53 = collection.UpdateOne(a => a.Name == "zhangsan", update3);
            Console.WriteLine(json53);


            //数组更新移除
            UpdateDefinition <Student> update4 = updateBuilder
                                                 .Set(a => a.Name, "zhangsan")
                                                 .Inc(a => a.Age, 100)
                                                 .Pull(a => a.Hobbies, "购物")
                                                 .PullFilter(a => a.Courses, a => a.Name == "毛泽东思想概论");

            var json54    = update4.RenderToBsonDocument();
            var student54 = collection.UpdateOne(a => a.Name == "修改名称", update4);
            Console.WriteLine(json54);


            //匹配数组中得某个元素,并更新这个元素的相关字段
            UpdateDefinition <Student> update5 = updateBuilder
                                                 .Set(a => a.Courses[-1].Name, "ssss");

            var json55    = update5.RenderToBsonDocument();
            var student55 = collection.UpdateOne(a => a.Courses.Any(b => b.Name == "马克思主义理论基础"), update5);
            Console.WriteLine(json55);



            UpdateDefinition <Student> update6 = updateBuilder
                                                 .Mul(a => a.Age, 12);

            var op = new FindOneAndUpdateOptions <Student>()
            {
                IsUpsert       = true,
                ReturnDocument = ReturnDocument.After
            };

            var student56 = collection.FindOneAndUpdate <Student>(a => a.Age > 26, update6, op);



            var update7 = updateBuilder
                          .PopFirst(a => a.Hobbies)
                          .PopLast(a => a.Courses);
            var json57    = update7.RenderToBsonDocument();
            var student57 = collection.UpdateOne(a => a.Name == "zhangsan", update7);
            Console.WriteLine(json57);



            var update8 = updateBuilder
                          .SetOnInsert(a => a.Name, "ssss");

            var json58    = update8.RenderToBsonDocument();
            var student58 = collection.UpdateOne(a => a.Name == "ls", update8, new UpdateOptions()
            {
                IsUpsert = true
            });
            Console.WriteLine(json58);


            var update9 = updateBuilder
                          .Rename(a => a.Address, "homeAddress");

            var json59    = update9.RenderToBsonDocument();
            var student59 = collection.UpdateOne(a => a.Name == "wangwu", update9);
            Console.WriteLine(json59);


            var update10 = updateBuilder
                           .Set(a => a.Name, "**");

            var json510    = update10.RenderToBsonDocument();
            var student510 = collection.UpdateMany(a => a.Age > 20, update10);
            Console.WriteLine(json510);

            //根据条件动态更新
            var update11 = updateBuilder
                           .Set(a => a.Name, "**");
            if (true)
            {
                update11 = update11.Set(a => a.Age, 12);
            }
            var json511 = update11.RenderToBsonDocument();
            Console.WriteLine(json511);

            Console.WriteLine("==============更新==============");
            #endregion

            Console.WriteLine();

            #region 6.聚合(Aggregation)


            Console.WriteLine("==============聚合==============");


            var pipeline1 = new BsonDocument[] {
                new BsonDocument {
                    { "$sort", new BsonDocument("_id", 1) }
                },
                new BsonDocument {
                    { "$group", new BsonDocument {
                          { "_id", "$age" },
                          { "min", new BsonDocument {
                                             { "$min", "$age" }
                                         } }
                      } }
                }
            };

            var student61 = collection.Aggregate <BsonDocument>(pipeline1).ToListAsync();



            var agg = collection.Aggregate();

            var gg = agg
                     .Match(a => a.Age > 10)
                     .Project(a => new
            {
                a.Age,
                a.Name
            })
                     .Group(key => key.Age, g => new
            {
                age   = g.Key,
                count = g.Count(),
                max   = g.Max(a => a.Age),
                min   = g.Min(a => a.Age),
                avg   = g.Average(a => a.Age)
            });


            var json62    = gg.ToString();
            var student62 = gg.ToList();
            Console.WriteLine(json62);

            Console.WriteLine("==============聚合==============");


            #endregion

            Console.WriteLine();

            #region 7.删除数据

            var student71 = collection.DeleteOne(a => a.Age > 100);

            var student72 = collection.DeleteMany(a => a.Age > 100);

            var op7 = new FindOneAndDeleteOptions <Student>()
            {
            };
            var student73 = collection.FindOneAndDelete <Student>(a => a.Age > 100, op7);


            #endregion

            Console.WriteLine();

            #region 8.快速使用

            Console.WriteLine("==============快速使用==============");

            var student80 = collection.Find(a => true).FirstOrDefault();

            var students81 = collection.Find(a => true).ToList();

            var students82 = collection.Find(a => true).Skip(80).Limit(20).ToList();

            var long83 = collection.Find(a => true).CountDocuments();

            var bool84 = collection.Find(a => true).Any();

            var students85 = collection.Find(a => true).SortBy(a => a.Id).SortByDescending(a => a.Age).ToList();


            var queryable = collection.AsQueryable();

            var queryable86 = queryable.Where(a => a.Age > 20).Select(a => new
            {
                a.Age,
                a.Name
            })
                              .GroupBy(a => a.Age)
                              .Select(g => new
            {
                g.Key,
                Max   = g.Max(a => a.Age),
                Min   = g.Min(a => a.Age),
                Avg   = g.Average(a => a.Age),
                Name  = g.First().Name,
                Count = g.Count(),
            });


            var json86 = queryable86.ToString();
            Console.WriteLine(json86);

            Console.WriteLine("==============快速使用==============");


            #endregion

            #region 9.执行命令

            //批量更新不同的值
            var dic = new Dictionary <string, object>()
            {
                { "update", "students" },
                { "updates", new List <BsonDocument>() }
            };

            //循环生成不同的更新命令
            for (int i = 0; i < 10; i++)
            {
                ((List <BsonDocument>)dic["updates"]).Add(new BsonDocument()
                {
                    { "q", new BsonDocument("age", i * 5) },
                    {
                        "u", new BsonDocument("$set",
                                              new BsonDocument()
                        {
                            { "age", i + 2 },
                            { "name", i + "-" }
                        }
                                              )
                    },
                });
            }

            var result = database.RunCommand <BsonDocument>(new BsonDocument(dic));

            #endregion
            //批量操作
            #region 10.批量操作
            var write = new UpdateOneModel <Student>(filter211, update10);
            collection.BulkWrite(new List <UpdateOneModel <Student> >()
            {
                write
            });
            #endregion

            #region 11.DbContext封装
            var students = SchoolDbContext.Students.Find(a => true);

            using (var session = SchoolDbContext.MongoClient.StartSession())
            {
                session.StartTransaction();
                SchoolDbContext.Students.Find(session, a => true);
                session.CommitTransaction();
            }


            #endregion


            #region 12.测试

            WriteConcern writeConcern = new WriteConcern();

            var update12 = Builders <Student> .Update.Set(a => a.Age, 25);

            var result12 = database.GetCollection <Student>("student22").UpdateOne(a => a.Name == "ss", update12);

            #endregion

            #region 13.聚合2

            var p1         = PipelineStageDefinitionBuilder.Match <Student>(a => a.Name == "**");
            var student101 = collection.Aggregate().AppendStage(p1).ToList();

            #endregion

            #region 13.连接

            //参看:https://stackoverflow.com/questions/50530363/aggregate-lookup-with-c-sharp

            Console.WriteLine("==============连接查询==============");
            var studentQuery   = database.GetCollection <Student>("student").AsQueryable();
            var classroomQuery = database.GetCollection <ClassRoom>("classroom").AsQueryable();

            //使用集合的方式来解决左连接
            var student102 = from s in studentQuery.Where(a => a.Name == "**")
                             join c in classroomQuery on s.classroomid equals c.Id into joined
                             select new
            {
                s.Name,
                s.Age,
                classname = joined
            };

            var query102 = student102.ToString();
            Console.WriteLine(query102);
            var result102 = student102.ToList();

            //database.GetCollection<Student>("student").Aggregate()
            //    .Lookup().ToList();


            #endregion

            #region 14 动态生成根据id查找

            var result141 = collection.FindById("5d8894a114294d2acc82ecd6").Result;
            #endregion
        }
Exemple #36
0
        private (DisposableMongoClient Client, Dictionary <string, EventCapturer> ClientEventCapturers) CreateClient(BsonDocument entity)
        {
            var    clientEventCapturers       = new Dictionary <string, EventCapturer>();
            string clientId                   = null;
            var    commandNamesToSkipInEvents = new List <string>();
            List <(string Key, IEnumerable <string> Events, List <string> CommandNotToCapture)> eventTypesToCapture = new ();
            var       readConcern             = ReadConcern.Default;
            var       retryReads              = true;
            var       retryWrites             = true;
            var       useMultipleShardRouters = false;
            var       writeConcern            = WriteConcern.Acknowledged;
            ServerApi serverApi = null;

            foreach (var element in entity)
            {
                switch (element.Name)
                {
                case "id":
                    clientId = element.Value.AsString;
                    break;

                case "uriOptions":
                    foreach (var option in element.Value.AsBsonDocument)
                    {
                        switch (option.Name)
                        {
                        case "retryWrites":
                            retryWrites = option.Value.AsBoolean;
                            break;

                        case "retryReads":
                            retryReads = option.Value.AsBoolean;
                            break;

                        case "readConcernLevel":
                            var levelValue = option.Value.AsString;
                            var level      = (ReadConcernLevel)Enum.Parse(typeof(ReadConcernLevel), levelValue, true);
                            readConcern = new ReadConcern(level);
                            break;

                        case "w":
                            writeConcern = new WriteConcern(option.Value.AsInt32);
                            break;

                        default:
                            throw new FormatException($"Unrecognized client uriOption name: '{option.Name}'.");
                        }
                    }
                    break;

                case "useMultipleMongoses":
                    useMultipleShardRouters = element.Value.AsBoolean;
                    break;

                case "observeEvents":
                    var observeEvents = element.Value.AsBsonArray.Select(x => x.AsString);
                    eventTypesToCapture.Add(
                        (Key: Ensure.IsNotNull(clientId, nameof(clientId)),
                         Events: observeEvents,
                         CommandNotToCapture: commandNamesToSkipInEvents));
                    break;

                case "ignoreCommandMonitoringEvents":
                    commandNamesToSkipInEvents.AddRange(element.Value.AsBsonArray.Select(x => x.AsString));
                    break;

                case "serverApi":
                    ServerApiVersion serverApiVersion           = null;
                    bool?            serverApiStrict            = null;
                    bool?            serverApiDeprecationErrors = null;
                    foreach (var option in element.Value.AsBsonDocument)
                    {
                        switch (option.Name)
                        {
                        case "version":
                            var serverApiVersionString = option.Value.AsString;
                            switch (serverApiVersionString)
                            {
                            case "1":
                                serverApiVersion = ServerApiVersion.V1;
                                break;

                            default:
                                throw new FormatException($"Unrecognized serverApi version: '{serverApiVersionString}'.");
                            }
                            break;

                        case "strict":
                            serverApiStrict = option.Value.AsBoolean;
                            break;

                        case "deprecationErrors":
                            serverApiDeprecationErrors = option.Value.AsBoolean;
                            break;

                        default:
                            throw new FormatException($"Unrecognized client serverApi option name: '{option.Name}'.");
                        }
                    }
                    if (serverApiVersion != null)
                    {
                        serverApi = new ServerApi(serverApiVersion, serverApiStrict, serverApiDeprecationErrors);
                    }
                    break;

                case "storeEventsAsEntities":
                    var eventsBatches = element.Value.AsBsonArray;
                    foreach (var batch in eventsBatches.Cast <BsonDocument>())
                    {
                        var id     = batch["id"].AsString;
                        var events = batch["events"].AsBsonArray.Select(e => e.AsString);
                        eventTypesToCapture.Add((id, events, CommandNotToCapture: null));
                    }
                    break;

                default:
                    throw new FormatException($"Unrecognized client entity field: '{element.Name}'.");
                }
            }

            if (eventTypesToCapture.Count > 0)
            {
                var defaultCommandNamesToSkip = new List <string>
                {
                    "authenticate",
                    "buildInfo",
                    "configureFailPoint",
                    "getLastError",
                    "getnonce",
                    "isMaster",
                    "saslContinue",
                    "saslStart"
                };

                foreach (var eventsDetails in eventTypesToCapture)
                {
                    var commandNamesNotToCapture = Enumerable.Concat(eventsDetails.CommandNotToCapture ?? Enumerable.Empty <string>(), defaultCommandNamesToSkip);
                    var formatter     = _eventFormatters.ContainsKey(eventsDetails.Key) ? _eventFormatters[eventsDetails.Key] : null;
                    var eventCapturer = CreateEventCapturer(eventsDetails.Events, commandNamesNotToCapture, formatter);
                    clientEventCapturers.Add(eventsDetails.Key, eventCapturer);
                }
            }

            var eventCapturers = clientEventCapturers.Select(c => c.Value).ToArray();
            var client         = DriverTestConfiguration.CreateDisposableClient(
                settings =>
            {
                settings.RetryReads        = retryReads;
                settings.RetryWrites       = retryWrites;
                settings.ReadConcern       = readConcern;
                settings.WriteConcern      = writeConcern;
                settings.HeartbeatInterval = TimeSpan.FromMilliseconds(5);     // the default value for spec tests
                settings.ServerApi         = serverApi;
                if (eventCapturers.Length > 0)
                {
                    settings.ClusterConfigurator = c =>
                    {
                        foreach (var eventCapturer in eventCapturers)
                        {
                            c.Subscribe(eventCapturer);
                        }
                    };
                }
            },
                useMultipleShardRouters);

            return(client, clientEventCapturers);
        }
        private Type0CommandMessageSection <BsonDocument> CreateType0Section(ConnectionDescription connectionDescription)
        {
            var extraElements = new List <BsonElement>();

            AddIfNotAlreadyAdded("$db", _databaseNamespace.DatabaseName);

            if (connectionDescription?.IsMasterResult.ServerType != ServerType.Standalone &&
                _readPreference != null &&
                _readPreference != ReadPreference.Primary)
            {
                var readPreferenceDocument = QueryHelper.CreateReadPreferenceDocument(_readPreference);
                AddIfNotAlreadyAdded("$readPreference", readPreferenceDocument);
            }

            if (_session.Id != null)
            {
                if (IsSessionAcknowledged())
                {
                    AddIfNotAlreadyAdded("lsid", _session.Id);
                }
                else
                {
                    if (_session.IsImplicit)
                    {
                        // do not set sessionId if session is implicit and write is unacknowledged
                    }
                    else
                    {
                        throw new InvalidOperationException("Explicit session must not be used with unacknowledged writes.");
                    }
                }
            }


            var snapshotReadConcernDocument = ReadConcernHelper.GetReadConcernForSnapshotSesssion(_session, connectionDescription);

            if (snapshotReadConcernDocument != null)
            {
                extraElements.Add(new BsonElement("readConcern", snapshotReadConcernDocument));
            }

            if (_session.ClusterTime != null)
            {
                AddIfNotAlreadyAdded("$clusterTime", _session.ClusterTime);
            }
#pragma warning disable 618
            Action <BsonWriterSettings> writerSettingsConfigurator = null;
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
            {
                writerSettingsConfigurator = s => s.GuidRepresentation = GuidRepresentation.Unspecified;
            }
#pragma warning restore 618

            _session.AboutToSendCommand();
            if (_session.IsInTransaction)
            {
                var transaction = _session.CurrentTransaction;
                AddIfNotAlreadyAdded("txnNumber", transaction.TransactionNumber);
                if (transaction.State == CoreTransactionState.Starting)
                {
                    AddIfNotAlreadyAdded("startTransaction", true);
                    var readConcern = ReadConcernHelper.GetReadConcernForFirstCommandInTransaction(_session, connectionDescription);
                    if (readConcern != null)
                    {
                        AddIfNotAlreadyAdded("readConcern", readConcern);
                    }
                }
                AddIfNotAlreadyAdded("autocommit", false);
            }
            if (_serverApi != null)
            {
                AddIfNotAlreadyAdded("apiVersion", _serverApi.Version.ToString());
                if (_serverApi.Strict.HasValue)
                {
                    AddIfNotAlreadyAdded("apiStrict", _serverApi.Strict.Value);
                }
                if (_serverApi.DeprecationErrors.HasValue)
                {
                    AddIfNotAlreadyAdded("apiDeprecationErrors", _serverApi.DeprecationErrors.Value);
                }
            }

            var elementAppendingSerializer = new ElementAppendingSerializer <BsonDocument>(BsonDocumentSerializer.Instance, extraElements, writerSettingsConfigurator);
            return(new Type0CommandMessageSection <BsonDocument>(_command, elementAppendingSerializer));

            void AddIfNotAlreadyAdded(string key, BsonValue value)
            {
                if (!_command.Contains(key))
                {
                    extraElements.Add(new BsonElement(key, value));
                }
            }

            bool IsSessionAcknowledged()
            {
                if (_command.TryGetValue("writeConcern", out var writeConcernDocument))
                {
                    var writeConcern = WriteConcern.FromBsonDocument(writeConcernDocument.AsBsonDocument);
                    return(writeConcern.IsAcknowledged);
                }
                else
                {
                    return(true);
                }
            }
        }
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="mongoClientSettings">The settings for a MongoDB client.</param>
 /// <param name="dbName">数据库名称</param>
 /// <param name="collectionName">集合名称</param>
 /// <param name="writeConcern"></param>
 /// <param name="readPreference"></param>
 /// <param name="sequence">Mongo自增长ID数据序列对象</param>
 public MongoBaseRepository(MongoClientSettings mongoClientSettings, string dbName, string collectionName = null, WriteConcern writeConcern = null, ReadPreference readPreference = null, MongoSequence sequence = null)
     : this()
 {
     this._sequence      = sequence ?? new MongoSequence();
     this._mongoSession  = new MongoSession(mongoClientSettings, dbName, writeConcern: writeConcern, readPreference: readPreference);
     this.CollectionName = collectionName ?? typeof(TEntity).Name;
 }
Exemple #39
0
 public Task <WriteConcernResult> RemoveAsync <T>(string collectionName, IMongoQuery query, RemoveFlags removeFlags, WriteConcern writeConcern)
 {
     return(_asyncUpdater.RemoveAsync <T>(collectionName, query, removeFlags, writeConcern));
 }
Exemple #40
0
 public WriteConcernResult Remove <T>(string collectionName, IMongoQuery query, RemoveFlags removeFlags, WriteConcern writeConcern)
 {
     return(_updater.Remove <T>(collectionName, query, removeFlags, writeConcern));
 }
Exemple #41
0
 /// <summary>
 /// Returns true if the write concern value supplied is one that should be sent to the server and the server version supports the commands that write accept write concern feature.
 /// </summary>
 /// <param name="serverVersion">The server version.</param>
 /// <param name="value">The write concern value.</param>
 /// <returns>Whether the write concern should be sent to the server.</returns>
 public bool ShouldSendWriteConcern(SemanticVersion serverVersion, WriteConcern value)
 {
     return(value != null && !value.IsServerDefault && base.IsSupported(serverVersion));
 }
Exemple #42
0
 public override IMongoDatabase WithWriteConcern(WriteConcern writeConcern)
 {
     throw new NotImplementedException();
 }
 public IMongoClient WithWriteConcern(WriteConcern writeConcern) => _mongoClient.WithWriteConcern(writeConcern);
Exemple #44
0
 public IMongoClient WithWriteConcern(WriteConcern writeConcern)
 {
     return(wrapped.WithWriteConcern(writeConcern));
 }
Exemple #45
0
 public IMongoCollection <TModel> WithWriteConcern(WriteConcern writeConcern) => _collection.WithWriteConcern(writeConcern);
Exemple #46
0
 public IMongoClient WithWriteConcern(WriteConcern writeConcern)
 {
     throw new NotImplementedException();
 }
        private bool TryGetWriteConcernFromGLE(Queue <RequestMessage> messageQueue, out int requestId, out WriteConcern writeConcern)
        {
            requestId    = -1;
            writeConcern = null;
            if (messageQueue.Count == 0)
            {
                return(false);
            }

            var message = messageQueue.Peek();

            if (message.MessageType != MongoDBMessageType.Query)
            {
                return(false);
            }

            var queryMessage = (QueryMessage)message;

            if (!IsCommand(queryMessage.CollectionNamespace))
            {
                return(false);
            }

            var query        = queryMessage.Query;
            var firstElement = query.GetElement(0);

            if (firstElement.Name != "getLastError")
            {
                return(false);
            }

            messageQueue.Dequeue(); // consume it so that we don't process it later...
            requestId = queryMessage.RequestId;

            writeConcern = WriteConcern.FromBsonDocument(query);
            return(true);
        }
Exemple #48
0
 public MongoDatabase GetDatabase(string databaseName, WriteConcern writeConcern)
 {
     return(_mongoServer.GetDatabase(databaseName, writeConcern));
 }
Exemple #49
0
 public IMongoDatabase WithWriteConcern(WriteConcern writeConcern)
 {
     return(_mongoDatabase.WithWriteConcern(writeConcern));
 }
Exemple #50
0
 /// <inheritdoc/>
 public IMongoDatabase WithWriteConcern(WriteConcern writeConcern)
 {
     throw new System.NotImplementedException();
 }
 public static WriteConcernResult DeletewithConcern <TEntity>(this ICommandRepository repository, TEntity entity, WriteConcern writeConcern = null) where TEntity : class
 {
     return(_DefaultImplementation.DeletewithConcern(repository, entity, writeConcern));
 }
Exemple #52
0
 public IMongoCollection <InformationEntry> WithWriteConcern(WriteConcern writeConcern)
 {
     throw new System.NotImplementedException();
 }
 public static WriteConcernResult UpsertWithConcern <TEntity>(this IRepository repository, TEntity entity, WriteConcern writeConcern = null) where TEntity : class
 {
     return(_DefaultImplementation.UpsertWithConcern(repository, entity, writeConcern));
 }
Exemple #54
0
 /// <inheritdoc/>
 public IMongoCollection <T> WithWriteConcern(WriteConcern writeConcern)
 {
     return(_actualCollection.WithWriteConcern(writeConcern));
 }
Exemple #55
0
 public virtual IMongoClient WithWriteConcern(WriteConcern writeConcern) => throw new NotImplementedException();
 public void RemoveAsync <T>(string collectionName, IMongoQuery query, WriteConcern writeConcern)
 {
     new Func <string, IMongoQuery, WriteConcern, WriteConcernResult>(_updater.Remove <T>).BeginInvoke(collectionName, query, writeConcern, CallbackwriteConcernResult, null);
 }
Exemple #57
0
 public abstract IMongoClient WithWriteConcern(WriteConcern writeConcern);
        protected WriteConcernResult SendMessageWithWriteConcern(
            MongoConnection connection,
            BsonBuffer buffer,
            int requestId,
            BsonBinaryReaderSettings readerSettings,
            BsonBinaryWriterSettings writerSettings,
            WriteConcern writeConcern)
        {
            CommandDocument getLastErrorCommand = null;

            if (writeConcern.Enabled)
            {
                var fsync    = (writeConcern.FSync == null) ? null : (BsonValue)writeConcern.FSync;
                var journal  = (writeConcern.Journal == null) ? null : (BsonValue)writeConcern.Journal;
                var w        = (writeConcern.W == null) ? null : writeConcern.W.ToGetLastErrorWValue();
                var wTimeout = (writeConcern.WTimeout == null) ? null : (BsonValue)(int)writeConcern.WTimeout.Value.TotalMilliseconds;

                getLastErrorCommand = new CommandDocument
                {
                    { "getlasterror", 1 }, // use all lowercase for backward compatibility
                    { "fsync", fsync, fsync != null },
                    { "j", journal, journal != null },
                    { "w", w, w != null },
                    { "wtimeout", wTimeout, wTimeout != null }
                };

                // piggy back on network transmission for message
                var getLastErrorMessage = new MongoQueryMessage(writerSettings, DatabaseName + ".$cmd", QueryFlags.None, 0, 1, getLastErrorCommand, null);
                getLastErrorMessage.WriteToBuffer(buffer);
            }

            connection.SendMessage(buffer, requestId);

            WriteConcernResult writeConcernResult = null;

            if (writeConcern.Enabled)
            {
                var writeConcernResultSerializer = BsonSerializer.LookupSerializer(typeof(WriteConcernResult));
                var replyMessage = connection.ReceiveMessage <WriteConcernResult>(readerSettings, writeConcernResultSerializer, null);
                if (replyMessage.NumberReturned == 0)
                {
                    throw new MongoCommandException("Command 'getLastError' failed. No response returned");
                }
                writeConcernResult         = replyMessage.Documents[0];
                writeConcernResult.Command = getLastErrorCommand;

                if (!writeConcernResult.Ok)
                {
                    var errorMessage = string.Format(
                        "WriteConcern detected an error '{0}'. (response was {1}).",
                        writeConcernResult.ErrorMessage, writeConcernResult.Response.ToJson());
                    throw new WriteConcernException(errorMessage, writeConcernResult);
                }
                if (writeConcernResult.HasLastErrorMessage)
                {
                    var errorMessage = string.Format(
                        "WriteConcern detected an error '{0}'. (Response was {1}).",
                        writeConcernResult.LastErrorMessage, writeConcernResult.Response.ToJson());
                    throw new WriteConcernException(errorMessage, writeConcernResult);
                }
            }

            return(writeConcernResult);
        }
Exemple #59
0
 protected virtual void SetWriteConcern(WriteConcern value)
 {
     _database = _database.WithWriteConcern(value);
 }
        protected override bool TrySetArgument(string name, BsonValue value)
        {
            switch (name)
            {
                case "document":
                    _document = (BsonDocument)value;
                    return true;
                case "writeConcern":
                    _writeConcern = WriteConcern.FromBsonDocument((BsonDocument)value);
                    return true;
            }

            return false;
        }