В вашем классе POCO Books
- это список .NET, поэтому вы можете (теоретически) использовать все методы расширения (например, All
).Проблема в том, что это не LINQ для объектов, поэтому это выражение не оценивается в памяти.Драйвер MongoDB пытается преобразовать это в запрос MongoDB, и, как вы можете видеть, в языке запросов MongoDB нет соответствующего оператора.
Что вы можете сделать?Вы можете попробовать переписать этот фильтр во что-то другое (сохранив то же логическое значение).Например, вы можете использовать $ elemMatch .Вместо того, чтобы пытаться найти все книги с IsVerified
, равным true, вы можете создать свой запрос, пытаясь найти документы, имеющие хотя бы одну книгу, равную false, и затем использовать $not
, чтобы отменить это условие.В этом случае $elemMatch
становится полезным:
Оператор $ elemMatch сопоставляет документы, содержащие поле массива, с хотя бы одним элементом , который соответствует всем указанным критериям запроса.
То есть не на хотя бы на одном означает нет .
Тогда ваш код может выглядеть следующим образом:
var col = mydb.GetCollection<Library>("Libraries");
var filter = Builders<Library>.Filter.Not(
Builders<Library>.Filter.ElemMatch(x => x.Author.Books, b => b.IsVerified == false));
var update = Builders<Library>.Update.Set(l => l.AllBooks, true);
await col.UpdateManyAsync(filter, update);