FindOneAndUpdateAsync间歇性返回Null。

问题描述 投票:0回答:1

我正在使用MongoDB.Driver for .NET Core 3.1,遇到了一个问题,就是记录没有被正确保存。当调用FindOneAndUpdateAsync时,记录间歇性地返回为null。我有一个脚本,调用下面的代码100次。在这100次中,有1-5次在最后一个方法SetChildFavoritesAsync中失败。结果显示为null。有什么建议可以告诉我,我做错了什么?

示例调用

var id = 1;
var childName = "test";
var collectionEntry = await FindByIdOrCreateAsync(id);

collectionEntry.Children = new List<MyCollection.ChildClass>{
  new MyCollection.ChildClass{
    Name = childName,
    Favorites = new List<MyCollection.ChildClass.Favorite>()
  }
};
await FindByIdAndUpdateChildrenAsync(collectionEntry.Id, collectionEntry.Children);

var favorites = new List<MyCollection.ChildClass.Favorite>{
  Name = "testFavorite"
};
var resultsOfSet = await SetChildFavoritesAsync(id, name, favorites)
//do stuff with resultsOfSet

示例模型

public class MyCollection
        {
            [MongoDB.Bson.Serialization.Attributes.BsonRepresentation(BsonType.ObjectId)]
            [MongoDB.Bson.Serialization.Attributes.BsonId]
            public string _Id { get; set; }
            [MongoDB.Bson.Serialization.Attributes.BsonRequired]
            public int Id { get; set; }
            public List<ChildClass> Children { get; set; }

            public class ChildClass
            {
                public string Name { get; set; }
                public List<Favorite> Favorites { get; set; }

                public class Favorite
                {
                    public string Name { get; set; }
                }
            }
        }

方法示例

public async Task<MyCollection> FindByIdOrCreateAsync(int id)
        {
            var filter = Builders<MyCollection>.Filter.Eq(mc => mc.Id, id);
            var update = Builders<MyCollection>.Update
                            .Set(mc => mc.Id, id)
                            .SetOnInsert(mc => mc.Children, new List<MyCollection.ChildClass>());
            var options = new FindOneAndUpdateOptions<MyCollection> { ReturnDocument = ReturnDocument.After, IsUpsert = true };
            return await _database.GetCollection<MyCollection>("MyCollectionName").FindOneAndUpdateAsync(filter, update, options);
        }

public async Task<MyCollection> FindByIdAndUpdateChildrenAsync(int collectionId, List<MyCollection.ChildClass> children)
        {
            var filter = Builders<MyCollection>.Filter.Eq(mc => mc.Id, collectionId);
            var update = Builders<MyCollection>.Update.Set(mc => mc.Children, children);
            var options = new FindOneAndUpdateOptions<MyCollection> { ReturnDocument = ReturnDocument.After, IsUpsert = false };
            return await _database.GetCollection<MyCollection>("MyCollectionName").FindOneAndUpdateAsync(filter, update, options);
        }

public async Task<MyCollection> SetChildFavoritesAsync(int collectionId, string childName, List<MyCollection.ChildClass.Favorite> favorites)
        {
            var filter = Builders<MyCollection>.Filter.Eq(mc => mc.Id, collectionId);
            filter &= Builders<MyCollection>.Filter.Eq("children.name", childName);
            var update = Builders<MyCollection>.Update.Set("children.$.favorites", favorites);
            var options = new FindOneAndUpdateOptions<MyCollection> { ReturnDocument = ReturnDocument.After };
            var results = await _database.GetCollection<MyCollection>("MyCollectionName").FindOneAndUpdateAsync(filter, update, options);
            if (results == null)
            {
                _log.Error($"Child Favorites didn't save: collectionId:{collectionId}, childName:{childName}");
            }
            else
            {
                _log.Debug($"Child Favorites: collectionId:{collectionId}, childName:{childName}, favorites:{Newtonsoft.Json.JsonConvert.SerializeObject(results)}");
            }
            return results;
        }
.net-core mongodb-.net-driver
1个回答
0
投票

似乎是与数据库通信的问题。我添加了一些重试逻辑,解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.