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
'programing' 카테고리의 다른 글
NSURL을 로컬 파일 경로로 변환 (0) | 2023.05.06 |
---|---|
Bash에서 명령 출력에 변수를 설정하려면 어떻게 해야 합니까? (0) | 2023.05.06 |
Git를 사용하지 않고 GitHub 저장소 내에 폴더 만들기 (0) | 2023.05.01 |
칼레이어를 사용한 반올림된 UI 보기 - 일부 코너만 - 어떻게? (0) | 2023.05.01 |
긴 길을 위한 "에일리어스"를 만드는 방법은? (0) | 2023.05.01 |