2015-01-27 8 views
1

MongoDB를 처음 접했고 MongoDB 문서를 읽었습니다. 나는 다음과 같은 구조를 가지고있다 : -MongoDB : 참조 된 문서 쿼리하기

public class User 
{ 
    [BsonId] 
    public long UserId { get; set; }   
    public string LoginId { get; set; } 
    public string Password { get; set; }   
    public List<string> Gateways { get; set; } 
} 
public class Gateway 
{ 
    [BsonId] 
    public string MACAddress { get; set; } 
    public string SerialNumber { get; set; } 
    public List<Device> Devices { get; set; } 
} 

게이트웨이가 USER의 부재 상태에서 별도의 존재를 가지고 있기 때문에 USER 문서의 참조 된 게이트웨이 MAC 주소.

var userQuery = Query<User>.EQ(u => u.UserId, aUserId); 
var userCursor = mMongoUserCollection.Find(userQuery); 
var gateways = mMongoGatewayCollection.AsQueryable<Gateway>().Where(g => userCursor.FirstOrDefault().Gateways.Contains(g.MACAddress)); 

그러나 다음과 같이 내 쿼리를 작성할 때

"Unable to determine Serialization Information for the expression: Enumerable.FirstOrDefault<User>" 

는 그러나 모든 것이 잘

가는 것을 나는 예외를 얻고있다 - : 주어진 UserId에 대한 모든 게이트웨이를 얻기 위해 다음과 같이 나는 쿼리를 작성하고
var userQuery = Query<User>.EQ(u => u.UserId, aUserId); 
var userCursor = mMongoUserCollection.Find(userQuery); 

List<string> desiredGateways = userCursor.FirstOrDefault().Gateways; 
var gateways = mMongoGatewayCollection.AsQueryable<Gateway>().Where(g => desiredGateways.Contains(g.MACAddress)); 

위의 두 가지 차이점을 알고 싶습니다.

+0

대신 JOINS를 사용하거나 RDBMS를 사용하지 마십시오. MongoDB는 JOIN을하지 않습니다. 모든 데이터를 "게이트웨이"목록 요소에 완전히 삽입하십시오. 또는 각 문서가 유효한'_id' 값의'List' 만 포함한다는 것을 받아들입니다. 이 문제를 해결하기 위해 다른 쿼리를 제출할 수는 있지만 그렇게하는 것이 유일한 방법입니다. 또 다른 쿼리를 제출함으로써 .. –

+0

@ Neil Lunn, 나는 당신의 요지를 얻었지만 내 게시물에서 편집 한 내 쿼리에 대한 견해를 제공하십시오. –

답변

1

차이점은 MongoDB C# 드라이버는 첫 번째 스 니펫을 MongoDB 쿼리로 변환 할 수 있지만 두 번째 스 니펫은 MongoDB 쿼리로 변환 할 수 없다는 것입니다. 당신이 IQueryableWhere를 호출 할 때 쿼리가 foreach 또는 ToList을 사용하고있을 실현 될 때까지

는 모든 람다 식을 저장합니다. 이 단계에서 공급자 (드라이버)는 관련 쿼리를 생성하여 데이터베이스에서 수행하려고 시도합니다.

FirstOfDefault이 무엇인지 모르기 때문에 데이터베이스에서 userCursor.FirstOrDefault()을 사용할 수없고 커서를받을 수 없습니다. 그러나 이전에 데이터베이스에서 검색 한 User 인스턴스를 일련화할 수 있습니다.