Обновить словарьв Mongodb - PullRequest
0 голосов
/ 28 ноября 2018

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

Вот мой класс модели монго:

public class UsageModel
{
    [BsonIgnore]
    public static readonly string CollectionName = "ApiUsage";

    [BsonRequired]
    public string User { get; set; }

    [BsonRequired, BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
    public Dictionary<DateTime, int> History  { get; private set; }

    public static IMongoCollection<UsageModel> Collection
    {
        get => MongoDb.Database.GetCollection<UsageModel>(CollectionName);
    }

    public static void IncrementTodayStats(string user)
    {
        var filter = Builders<UsageModel>.Filter.Eq(doc => doc.User, user);
        var update = Builders<UsageModel>.Update.
            SetOnInsert(doc => doc.History[DateTime.Now.Date], 0).
            Inc(doc => doc.History[DateTime.Now.Date], 1);
        var res = Collection.UpdateOne(filter, update);
    }
}

Проблема в том, что когда я звоню IncrementTodayStats, я получаю это исключение:

Невозможно определить информацию сериализации для doc => doc.History.get_Item (DateTime.Now.Date).

Я не знаю, что мне не хватает, так какУ меня нет большого опыта работы с MongoDB и сериализацией, и, как этот ответ советует, я поставил BsonDictionaryOptions decorator.

Я должен упомянуть, что перед увеличением History[DateTime.Now.Date] я уверен,что UsageModel, содержащий этот словарь, был создан, и я использовал SetOnInsert на случай, если запись для DateTime.Now.Date не присутствовала в словаре до этого запроса.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 29 ноября 2018

Если вы используете запрос LINQ, Mongo попытается проанализировать его и создать запрос.Если запрос LINQ не содержит никакой информации на стороне клиента, то вся обработка запроса происходит на стороне сервера.В любых других случаях водитель получает ВЕСЬ набор данных и производит оценку на стороне клиента.Этот механизм синтаксического анализа не может проанализировать DateTime.Now.Date, потому что это кажется свойством, но в основном это вызов функции.

Пожалуйста, используйте вместо нее переменную.

public static void IncrementTodayStats(string user)
{
    DateTime today = DateTime.Now.Date;

    var filter = Builders<UsageModel>.Filter.Eq(doc => doc.User, user);
    var update = Builders<UsageModel>.Update.
        SetOnInsert(doc => doc.History[today], 0).
        Inc(doc => doc.History[today], 1);
    var res = Collection.UpdateOne(filter, update);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...