Подтвердить что ты не робот

MongoDb С# драйвер находит элемент в массиве по значению поля

Я нашел способ проверить, содержит ли значение в простом массиве:

var filter = Builders<Post>.Filter.AnyEq(x => x.Tags, "mongodb");

Но как найти сложный элемент со многими полями по конкретному полю? Я нашел способ написать его с помощью метода точечной нотации с помощью BsonDocument builder, но как я могу это сделать с набранными лямбда-нотами?

обн

Я думаю, что это своего рода

builderInst.AnyIn(p => p.ComplexCollection.Select(ml => ml.Id), mlIds)

но не можете проверить прямо сейчас, может ли кто-нибудь помочь?

4b9b3361

Ответ 1

Существует ElemMatch

var filter = Builders<Post>.Filter.ElemMatch(x => x.Tags, x => x.Name == "test");
var res = await collection.Find(filter).ToListAsync()

Ответ 3

Как и в случае версии 2.4.2 для драйверов С#, интерфейс IFindFluent может использоваться для запроса элемента массива. ElemMatch не может использоваться в массиве строк напрямую, тогда как интерфейс find будет работать как с простыми, так и с комплексными типами (например, "Tags.Name" ) и строго типизирован.

            FilterDefinitionBuilder<Post> tcBuilder = Builders<Post>.Filter;
            FilterDefinition<Post> tcFilter = tcBuilder.Eq("Tags","mongodb") & tcBuilder.Eq("Tags","asp.net");
               ...
            await myCollection.FindAsync(tcFilter);

Драйвер Linq использует структуру агрегации, но для запроса без операторов агрегирования поиск быстрее.

Обратите внимание, что это было нарушено в предыдущих версиях драйвера, поэтому ответ не был доступен во время первоначальной публикации.