Добавить элемент в массив существующего элемента с помощью MongoDB & C # - PullRequest
0 голосов
/ 26 августа 2018

Мне нужно добавить новый комментарий к элементу массива, который является частью документа MongoDB через C #, но не могу понять, как это сделать.

Странно то, что когда я вставляюдокумент с тегами, которые хранятся в массиве строковых элементов, он работает как положено:

var post = new Post
{
    Title = model.Title,
    Author = User.Identity.Name,
    CreatedAtUtc = DateTime.Now,
    Content = model.Content,
    Tags = model.Tags.Split(",".ToCharArray()).ToList()
};

Теперь, когда я пытаюсь добавить новый комментарий к существующему документу, я использую следующее:

var filter = Builders<Post>.Filter.Eq("_id", model.PostId);

var update = Builders<Post>.Update.Push<Comment>("Comments", 
    new Comment
    {
        Author = User.Identity.Name,
        CreatedAtUtc = DateTime.Now,
        Content = model.Content
    });

var ret = await blogContext.Posts.FindOneAndUpdateAsync(filter, update);

Но в моем документе элемент «Комментарии» остается пустым:

"_id" : ObjectId("5b82ec466b63730fe4c51915"),
"Author" : "Joe",
"Content" : "content1",
"CreatedAtUtc" : ISODate("2018-08-26T18:06:53.238Z"),
"Title" : "title1",
"Comments" : [ ],
"Tags" : [
    "tag1.1",
    "tag1.2",
    " tag2.2"
]

Может кто-нибудь уточнить, как добавить дополнительный комментарий к существующему документу?

Спасибо

UPDATE-1:

Я нашел этот вопрос на StackOverflow: Как использовать модификатор $ push update в MongoDB и C # при обновлении массива вдокумент , в котором описана моя точная проблема, за исключением того, что массив используется в массиве строк, а не в массиве объекта / документа, но я все еще думал, что это разрешит его, адаптировав мой код к нему:

var filter = Builders<Post>.Filter.Eq("_id", model.PostId);
var update = Builders<Post>.Update
    .Push<Comment>(e => e.Comments, new Comment
        {
            Author = User.Identity.Name,
            CreatedAtUtc = DateTime.Now,
            Content = model.Content
        });

await blogContext.Posts.FindOneAndUpdateAsync(filter, update);

но это все ещеоставлю ли мой элемент массива комментариев пустым, как и в оригинальном вопросе.

Есть идеи?

1 Ответ

0 голосов
/ 27 августа 2018

Код, указанный в Update-1 моего вопроса, является правильным, и проблема всегда была связана с другой проблемой!

Model.PostId необходимо преобразовать в ObjectId:

var filter = Builders<Post>.Filter.Eq("_id", new ObjectId(model.PostId));

После преобразования «комментарий» добавляется, как и ожидалось, к свойству массива «Комментарии» документа.

Действительно расстраивает, что не выдает ошибку, сообщающую вамчто используемый тип недействителен!Потратил огромное количество времени на глупую ошибку, но урок выучил, я думаю !!

Надеюсь, это поможет другим!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...