4

I имеют следующую структуру:Как запросить коллекцию суб документа с использованием MongoDB и C# драйвер

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; } 
} 

, когда я сохраняю, она производит что-то вроде этого:

{ 
    "_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 
} 

Что я хотел бы сделайте это, если уже создан поток, чтобы использовать один и тот же текст и привязать сообщения к нему, основываясь на том, что пользователь отправляет одному пользователю или наоборот.

Я думал, что-то, как это будет работать, но она возвращается NULL (нет значения):

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

Я имею в виду, как у содержит все? или все? Не совсем уверен, как сделать запрос.

ответ

11

Попробуйте ElemMatch:

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

Хорошо, я постараюсь это прямо сейчас. – rball

+0

Удивительная благодарность! – rball

+3

Кто бы вы сделали это с новой версией драйвера MongoDB C#? потому что я не вижу, где класс Query находится в новой версии – RPDeshaies