2015-08-03 17 views
14

tôi tìm thấy những cách để kiểm tra là giá trị chứa trong mảng đơn giản:MongoDB C# tài xế tìm mục trong mảng bằng giá trị trường

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

Nhưng làm thế nào để tìm một mục phức tạp với nhiều lĩnh vực bởi một lĩnh vực cụ thể? Tôi đã tìm ra cách để viết nó thông qua cách tiếp cận ký hiệu dấu chấm với công cụ xây dựng BsonDocument, nhưng làm cách nào tôi có thể làm điều đó với các ký hiệu lambda đã nhập?

UPD

tôi nghĩ rằng nó một số loại

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

nhưng không thể kiểm tra ngay bây giờ, là bất cứ ai có thể giúp đỡ?

+0

Trông giống như một bài tập về nhà từ Đại học MongoDb. –

+0

Bản sao có thể có của mảng truy vấn [MongoDB + C# + truy vấn của các phần tử trong đó mỗi phần tử mảng chứa tài liệu phụ để truy vấn trên] (http://stackoverflow.com/questions/12024087/mongodb-c-sharp-driver-query-array -of-elements-where-each-array-element-cont) –

Trả lời

16

ElemMatch

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

Đây không phải là giải pháp tối ưu. Giải pháp tốt nhất là sử dụng http://api.mongodb.com/csharp/current/html/M_MongoDB_Driver_FilterDefinitionBuilder_1_AnyIn__1_1.htm – shiva8

+2

@ shiva8 Bạn không thể sử dụng 'AnyIn' khi bạn có mảng đối tượng phức tạp. – rnofenko

1

Tính đến phiên bản 2.4.2 của C# trình điều khiển, giao diện IFindFluent thể được sử dụng để truy vấn trên phần tử mảng. Không thể sử dụng ElemMatch trên một chuỗi các chuỗi trực tiếp, trong khi giao diện tìm kiếm sẽ hoạt động trên các loại đơn giản hoặc phức tạp (ví dụ: 'Thẻ.Name') và được nhập mạnh mẽ.

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

Trình điều khiển LINQ sử dụng khung tổng hợp, nhưng đối với truy vấn không tìm thấy toán tử tổng hợp nhanh hơn.

Lưu ý rằng điều này đã bị hỏng trong các phiên bản trước của trình điều khiển nên câu trả lời không có sẵn tại thời điểm đăng bài gốc.

Các vấn đề liên quan