diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs index 7939695ee..0c8b97697 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs @@ -34,8 +34,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents private readonly QueryReferrers queryReferrers; private readonly QueryScheduled queryScheduled; private readonly string name; + private readonly ReadPreference readPreference; - public MongoContentCollection(string name, IMongoDatabase database, IAppProvider appProvider) + public MongoContentCollection(string name, IMongoDatabase database, IAppProvider appProvider, ReadPreference readPreference) : base(database) { this.name = name; @@ -47,6 +48,8 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents queryReferences = new QueryReferences(queryByIds); queryReferrers = new QueryReferrers(); queryScheduled = new QueryScheduled(); + + this.readPreference = readPreference; } public IMongoCollection GetInternalCollection() @@ -59,6 +62,14 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents return name; } + protected override MongoCollectionSettings CollectionSettings() + { + return new MongoCollectionSettings + { + ReadPreference = readPreference + } + } + protected override Task SetupCollectionAsync(IMongoCollection collection, CancellationToken ct) { diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs index 8a3d0d6e4..f42f765d8 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs @@ -39,10 +39,12 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents Guard.NotNull(appProvider, nameof(appProvider)); collectionAll = - new MongoContentCollection("States_Contents_All3", database, appProvider); + new MongoContentCollection("States_Contents_All3", database, appProvider, + ReadPreference.Primary); collectionPublished = - new MongoContentCollection("States_Contents_Published3", database, appProvider); + new MongoContentCollection("States_Contents_Published3", database, appProvider, + ReadPreference.Secondary); this.appProvider = appProvider; } diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/FullText/MongoTextIndex.cs b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/FullText/MongoTextIndex.cs index eb975f0cb..e5ec59318 100644 --- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/FullText/MongoTextIndex.cs +++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/FullText/MongoTextIndex.cs @@ -82,7 +82,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.FullText public async Task?> SearchAsync(IAppEntity app, GeoQuery query, SearchScope scope) { var byGeo = - await Collection.Find( + await GetCollection(scope).Find( Filter.And( Filter.Eq(x => x.AppId, app.Id), Filter.Eq(x => x.SchemaId, query.SchemaId), @@ -126,7 +126,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.FullText private async Task> SearchBySchemaAsync(string queryText, IAppEntity app, TextFilter filter, SearchScope scope, int limit) { var bySchema = - await Collection.Find( + await GetCollection(scope).Find( Filter.And( Filter.Eq(x => x.AppId, app.Id), Filter.In(x => x.SchemaId, filter.SchemaIds), @@ -143,7 +143,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.FullText private async Task> SearchByAppAsync(string queryText, IAppEntity app, SearchScope scope, int limit) { var bySchema = - await Collection.Find( + await GetCollection(scope).Find( Filter.And( Filter.Eq(x => x.AppId, app.Id), Filter.Exists(x => x.SchemaId), @@ -168,5 +168,17 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.FullText return Filter.Eq(x => x.ServePublished, true); } } + + private IMongoCollection GetCollection(SearchScope scope) + { + if (scope == SearchScope.All) + { + return Collection; + } + else + { + return Collection.WithReadPreference(ReadPreference.Secondary); + } + } } }