Как использовать потоки изменений mongodb в нескольких коллекциях? - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь использовать Change Streams кодирования mongodb в C #, чтобы контролировать вставки, сделанные в двух коллекциях моего mongo.

Я без проблем поступил в одну коллекцию, а также в две коллекции, но создал отдельные темы, однако я считаю, что подход неправильный.

Одно решение для сбора:

class Program3
{
    static void Main(string[] args){
        CallMain(args).Wait();
        Console.ReadLine();
    }

    static async Task CallMain(string[] args){
        var client = new MongoClient("mongodb://wwww:wwwww@localhost:27017/test");
        var database = client.GetDatabase("test");
        var collection = database.GetCollection<BsonDocument>("Collection1");

        var options = new ChangeStreamOptions { FullDocument = ChangeStreamFullDocumentOption.Default};
        var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<BsonDocument>>().Match("{ operationType: 'insert' }");

        var cursor = collection.Watch<ChangeStreamDocument<BsonDocument>>(pipeline, options);
        var enumerator = cursor.ToEnumerable().GetEnumerator();
        while (enumerator.MoveNext()) {
            ChangeStreamDocument<BsonDocument> doc = enumerator.Current;
            // Do something here with your document
            Console.WriteLine(doc.DocumentKey);
        }
    }   
}

Два раствора для сбора (нитки)

class Program2
{
    static void Main(string[] args){
        CallMain(args).Wait();
        Console.ReadLine();
    }

    static async Task CallMain(string[] args){
        var client = new MongoClient("mongodb://wwww:wwwww@localhost:27017/test");
        var database = client.GetDatabase("test");
        var collection = database.GetCollection<BsonDocument>("Collection1");
        var collection2 = database.GetCollection<BsonDocument>("Collection2");

        var options = new ChangeStreamOptions { FullDocument = ChangeStreamFullDocumentOption.Default};
        var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<BsonDocument>>().Match("{ operationType: 'insert' }");

        ThreadStart childref = new ThreadStart(() => CallToChildThread(collection,options,pipeline));
        Thread childThread = new Thread(childref);
        childThread.Start();

        ThreadStart childref2 = new ThreadStart(() => CallToChildThread(collection2, options, pipeline));
        Thread childThread2 = new Thread(childref2);
        childThread2.Start();
    }

    public async static void CallToChildThread(IMongoCollection<BsonDocument> collection, ChangeStreamOptions options, 
        PipelineDefinition<ChangeStreamDocument<BsonDocument>, ChangeStreamDocument<BsonDocument>> pipeline){
        using (var cursor = await collection.WatchAsync<ChangeStreamDocument<BsonDocument>>(pipeline, options))
        {
            await cursor.ForEachAsync(doc =>
            {Console.WriteLine(doc.FullDocument);});
        }
    }
}

Я пытался использовать метод WatchAsync вместо Watch, но я не вижу различий. ¿Как справиться с обеими коллекциями? Асинхронный подход является предпочтительным.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...