4

를 사용하여 하위 문서 컬렉션을 쿼리하는 I의 구조는 다음과 같습니다어떻게 MongoDB를 및 C# 드라이버

{ 
    "_id" : ObjectId("4fa5eab4bfeddf23fcd01e4a"), 
    "Recipients" : [{ 
     "UserId" : "4fa5d4d8bfeddf23fc72e590", 
     "Status" : 1 
    }, { 
     "UserId" : "4fa5d4f9bfeddf23fc72e592", 
     "Status" : 0 
    }], 
    "Messages" : [{ 
     "FromUserId" : "4fa5d4d8bfeddf23fc72e590", 
     "FromUsername" : "a", 
     "FromAvatarUrl" : null, 
     "Sent" : ISODate("2012-05-06T03:06:28.396Z"), 
     "Text" : "b" 
    }], 
    "LastMessageSent" : ISODate("2012-05-06T03:06:28.395Z"), 
    "LastSentByUserName" : "a", 
    "LastSentAvatarUrl" : null, 
    "Snippet" : "b", 
    "MessageCount" : 1 
} 

것은 내가 싶은 것이 :

public class ThreadDocument 
{ 
    public ThreadDocument() 
    { 
     Messages = new List<Message>(); 
     Recipients = new List<Recipient>(); 
    } 

    [JsonIgnore] 
    public ObjectId Id { get; set; } 
    public IList<Recipient> Recipients { get; set; } 
    public IList<Message> Messages { get; set; } 
    public DateTime LastMessageSent { get; set; } 
    public string LastSentByUserName { get; set; } 
    public string LastSentAvatarUrl { get; set; } 
    public string Snippet { get; set; } 
    public int MessageCount { get; set; } 

} 

public class Recipient 
{ 
    public string UserId { get; set; } 
    public int Status { get; set; } 
} 

public class Message 
{ 
    public string FromUserId { get; set; } 
    public string FromUsername { get; set; } 
    public string FromAvatarUrl { get; set; } 
    public DateTime Sent { get; set; } 
    public string Text { get; set; } 
} 

내가 저장, 그것을 이런 식으로 뭔가를 생산을 이미 생성 된 스레드가있는 경우, 동일한 스레드를 사용하고 사용자가 동일한 사용자에게 또는 그 반대로 보내는 경우에 기반하여 메시지에 압정을 가하는 것입니다.

는이 같은 일이 일 것이라고 생각하지만, 널 (값 없음) 반환 : 나는처럼 생각하고

var thread = threadHelper.Collection.Find(
    Query.And(Query.EQ("Recipients.UserId", user.Id), Query.EQ("Recipients.UserId", sendToUser.Id)) 
).SingleOrDefault(); 

모두 포함을? 아니면 다 가지고 있니? 쿼리를 작성하는 방법을 잘 모르겠습니다. 나는 지금 것을 시도 할 것이다

var thread = threadHelper.Collection.Find(
    Query.And(
     Query.ElemMatch("Recipients", Query.EQ("UserId", user.Id)), 
     Query.ElemMatch("Recipients", Query.EQ("UserId", sendToUser.Id)) 
    ) 
).SingleOrDefault(); 

답변

11

ElemMatch을보십시오.
+0

확인 : – rball

+0

굉장히 고마워! – rball

+3

MongoDB C# 드라이버의 새 버전으로 누가이 프로그램을 작성합니까? Query 클래스가 새 버전에있는 곳을 볼 수 없기 때문에 – RPDeshaies