Добавление дополнительных записей заменяет все вместо добавления - PullRequest
1 голос
/ 26 мая 2020

Добрый день. Я новичок в mongodb, я могу успешно выполнить CRUD, но теперь я хочу углубиться в mongoDB. У меня есть этот JSON, и я хочу, чтобы он обновлял мою базу данных, когда в ней есть данные, и создавал новую, если она не существует, но что происходит, она всегда заменяет мое значение для «LeaderboardDetails».

Вот MongoDB JSON:

{
    "id" : "secretsomething",
    "UserID" : "zgahsjd",
    "category" : "testing",
    "Score" : 2000,
    "Badges" : 0,
    "LeaderboardDetails": {
        "id": "123123123213",
        "ScoreForDay": 10000,
        "BadgesForDay": 0
    } 
}

Когда я отправляю обновление "LeaderboardDetails", он должен добавить новую запись, если она не существует, в противном случае обновить текущую, но вместо этого он заменяет его.

Вот мой код для PUT:

public void Update(string id, SomeModel newScore)
{
    _record.ReplaceOne(scores => scores.id == id, newScore);
}

Вот код SomeModel:

    [Required]
    [JsonProperty(PropertyName = "UserID")]
    public string UserID { get; set; }

    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string id { get; set; }

    [Required]
    [JsonProperty(PropertyName = "category")]
    public string category { get; set; }

    [Required]
    public int Score { get; set; }

    [Required]
    public int Badges { get; set; }

    public class LeaderboardIDToSend
    {
        public string id;

        public string ScoreForDay;

        public string BadgesForDay;

        public LeaderboardIDToSend(string _id, string _score, string _badges)
        {
            id = _id;
            ScoreForDay = _score;
            BadgesForDay = _badges;
        }
    }
    [Required]
    public LeaderboardIDToSend LeaderboardDetails;

1 Ответ

1 голос
/ 26 мая 2020

Глядя на ваш json, leaderBoardDetails - это объект, но это должен быть список объектов, это первая модификация, которую вы должны сделать, во-вторых, чтобы добавить элемент для установки, вы должны используйте Builders<T>.Update.AddToSet(c => c.leaderBoardDetails, leaderboardDto), теперь что касается вашей проблемы, вы хотите обновить объект, насколько я знаю, и глядя на Операторы обновления массива , такого оператора нет, поэтому вам придется сделать это вручную , вам нужно загрузить весь ваш существующий лидер, затем проверить, существует ли этот идентификатор, если да, вам нужно обновить его значения, а затем обновить весь список (leaderBoardDetails), если он не существует, вы можете просто использовать AddToSet оператор

...