programing

MongoDb c# 드라이버 필드 값으로 배열에서 항목 찾기

abcjava 2023. 5. 6. 13:58
반응형

MongoDb c# 드라이버 필드 값으로 배열에서 항목 찾기

저는 단순 배열에 포함된 값을 확인하는 방법을 찾았습니다.

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

하지만 콘크리트 필드에서 많은 필드를 가진 복잡한 항목을 찾는 방법? 나는 점 표기법을 통해 그것을 쓰는 방법을 찾았습니다.BsonDocument빌더, 하지만 입력된 람다 표기법으로 어떻게 할 수 있습니까?

나는 그것이 일종이라고 생각합니다.

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

하지만 지금은 확인할 수 없습니다, 누가 도와주실 수 있나요?

있어ElemMatch

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

다음은 MongoDB를 사용하여 배열에서 하나의 복잡한 항목을 반환하는 예제입니다.드라이버 v2.5.0):

단순 데이터 모델

public class Zoo
{
    public List<Animal> Animals { get; set; }
}

public class Animal
{
    public string Name { get; set; }
}

옵션 1(집계)

public Animal FindAnimalInZoo(string animalName)
{
    var zooWithAnimalFilter = Builders<Zoo>.Filter
        .ElemMatch(z => z.Animals, a => a.Name == animalName);

    return _db.GetCollection<Zoo>("zoos").Aggregate()
        .Match(zooWithAnimalFilter)
        .Project<Animal>(
            Builders<Zoo>.Projection.Expression<Animal>(z => 
                z.Animals.FirstOrDefault(a => a.Name == animalName)))
        .FirstOrDefault(); // or .ToList() to return multiple
}

옵션 2(필터 & 링크) 이것은 나에게 약 5배 느렸습니다.

public Animal FindAnimalInZoo(string animalName)
{
    // Same as above
    var zooWithAnimalFilter = Builders<Zoo>.Filter
        .ElemMatch(z => z.Animals, a => a.Name == animalName);

    var zooWithAnimal = _db.GetCollection<Zoo>("zoos")
        .Find(zooWithAnimalFilter)
        .FirstOrDefault();

    return zooWithAnimal.Animals.FirstOrDefault(a => a.Name == animalName);
}

당신은 그것이 필요합니다.$elemMatch교환입니다.사용할 수 있습니다.Builders<T>.Filter.ElemMatch또는Any식:

Find(x => x.Tags.Any(t => t.Name == "test")).ToListAsync()

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/expressions/ #elematch

C# 드라이버의 2.4.2 릴리스부터 IFindFluent 인터페이스는 어레이 요소에 대한 쿼리에 사용할 수 있습니다.ElemMatch는 문자열 배열에서 직접 사용할 수 없지만 찾기 인터페이스는 단순 또는 복잡한 유형(예: '태그)에서 작동합니다.이름') 및 강력하게 입력되었습니다.

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

Linkq 드라이버는 집계 프레임워크를 사용하지만 집계 연산자가 없는 쿼리의 경우 검색 속도가 더 빠릅니다.

이 문제는 이전 버전의 드라이버에서 해결되지 않았기 때문에 원래 게시 당시에는 답변을 사용할 수 없었습니다.

언급URL : https://stackoverflow.com/questions/31786220/mongodb-c-sharp-driver-find-item-in-array-by-field-value

반응형