каждый!
Я создаю социальную сеть с открытым исходным кодом (я не знаю, смогу ли я разместить здесь URL), используя .net core 2.1, mongo atlas, используя драйвер v2.9.2
Я перехожу с MS SQL (который я умею на нем разбираться) на mongo (с которым я все еще учусь).
У меня есть две сущности, UserContent и UserContentComment, обе наследуют от Entity:
public class Entity
{
public Guid Id { get; set; }
public Guid UserId { get; set; }
public DateTime CreateDate { get; set; }
public Entity()
{
CreateDate = DateTime.Now;
}
}
public class UserContent : Entity
{
public string AuthorName { get; set; }
public string Content { get; set; }
public virtual List<UserContentComment> Comments { get; set; }
}
public class UserContentComment : Entity
{
public Guid UserContentId { get; set; }
public string AuthorName { get; set; }
public string Text { get; set; }
}
Я, вероятно, уберу некоторые свойства, поскольку они мне больше не понадобятся, например, UserContentId, потому что я добавлю UserContentComments в виде вложенного массива "Комментарии" UserContent, например:
{
"_id" : UUID("ff6e86cc-bddf-419d-e049-08d6b903e6db"),
"_t" : [
"Entity",
"UserContent"
],
"userId" : UUID("9d6e26ca-5bc7-4121-9b03-ed7f9a442cf6"),
"createDate" : ISODate("2019-04-04T16:38:23.740-03:00"),
"authorName" : "User Full Name",
"content" : "content main text",
"comments" : [
{
"_t" : [
"Entity",
"UserContentComment"
],
"_id" : UUID("d7dc1328-b1bc-4f1f-a9a5-08d6bf05b672"),
"userId" : UUID("5f9eeb34-22e2-43bf-9130-034a7997d2af"),
"createDate" : ISODate("2019-04-12T05:15:20.636-03:00"),
"userContentId" : UUID("ff6e86cc-bddf-419d-e049-08d6b903e6db"),
"authorName" : "User Full Name",
"text" : "Hello from Russia!"
}
]
}
Моя проблема в том, что мне нужно:
- Количество комментариев BY UserId;
- Получить комментарии BY UserId;
- Получить один комментарий BY Id;
- Обновление одного комментария по идентификатору;
- Обновление всех комментариев по идентификатору пользователя;
Как этого добиться, используя драйвер mongodb для C #?
Большое спасибо за помощь!
ОБНОВЛЕНИЕ - Что яполучил так далеко
Для подсчета комментариев я получил три способа:
var count = DbSet.Aggregate()
.Match(x => x.Comments.Any(y => y.UserId == userId))
.Project(new BsonDocument("count", new BsonDocument("$size", "$comments"))).ToList();
var q = Builders<UserContent>.Filter.ElemMatch(x => x.Comments, d => d.UserId == userId);
var p = Builders<UserContent>.Projection.ElemMatch(x => x.Comments, d => d.UserId == userId);
var data = DbSet.Find(q).Project(p).ToList();
var data2 = DbSet.Find(q).ToList();
Эти три разных запроса возвращают 28, потому что пользователь действительно прокомментировал 28 сообщений, но тамВсего в базе данных 31 комментарий, поскольку пользователь несколько раз комментировал некоторые сообщения. Что мне здесь не хватает?
ОБНОВЛЕНИЕ теперь СЧЕТ работает
Я получил счетчик, работающий с использованием этого кода:
DbSet.AsQueryable().SelectMany(x => x.Comments).Where(where).Count();
Я получил 31используя приведенный выше код, теперь это правильно!
Вопрос теперь: это будет работать в памяти или в БД?