Как считать, выбирать и обновлять вложенные элементы в mongodb + C # - PullRequest
0 голосов
/ 26 октября 2019

каждый!

Я создаю социальную сеть с открытым исходным кодом (я не знаю, смогу ли я разместить здесь 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используя приведенный выше код, теперь это правильно!

Вопрос теперь: это будет работать в памяти или в БД?

...