如何在 .Net 中验证 Mongo ObjectId

7

我遇到这样一个情况,需要一个方法接受一个ID,在Mongo中查找该值,如果没有找到,则在假设该项不存在于本地数据库的情况下调用另一个API来获取该项。

我的问题是,集合的MongoID配置为ObjectID。 当我尝试查找无效的id时,它会抛出异常:“不是有效的24位十六进制字符串”。 另一个API期望的id格式与此不同。 有没有办法在查找之前检查id是否有效?

我知道我可以将Mongo中的id更改为字符串,但为了和我们其他的集合保持一致,我宁愿不这样做。

该集合的注册方式如下:

        BsonClassMap.RegisterClassMap<Foo>(cm =>
        {
            cm.AutoMap();
            cm.MapIdMember(f => f.id)
            .SetIdGenerator(StringObjectIdGenerator.Instance)
            .SetSerializer(new StringSerializer(BsonType.ObjectId))
            .SetIgnoreIfDefault(true);
        });

抛出异常的查找方式如下:

await collection.FindAsync(foo => foo.id == id);

你尝试过使用 ObjectId.TryParse 吗?它返回 true,如果字符串可能是一个 ObjectId,并将解析后的 ObjectId 作为 out 参数返回。 - ScottyD0nt
@ScottyD0nt 谢谢,我错了,本来是在这里看的 http://mongodb.github.io/mongo-csharp-driver/2.8/apidocs/html/M_MongoDB_Bson_BsonObjectId_TryParse.htm ,以为那个方法已经被弃用了。不过看起来它仍然可以在这里使用:https://mongodb.github.io/mongo-csharp-driver/2.7/apidocs/html/M_MongoDB_Bson_ObjectId_TryParse.htm - zaq
解决了问题。谢谢! - zaq
1个回答

15

虽然已经在评论中讨论过,但我认为添加一个答案还是有必要的。

你可以使用ObjectId.TryParse方法。

var invalidObjId = "abc";

if(ObjectId.TryParse(invalidObjId, out _))
{
   // will never enter here.
}

var validObjId = "5ebd7246d2b0d6003887a8f4";

if(ObjectId.TryParse(validObjId, out _))
{
   // We will get here.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接