Я пытаюсь использовать 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, но я не вижу различий.
¿Как справиться с обеими коллекциями? Асинхронный подход является предпочтительным.
Заранее спасибо.