如何在C#中创建返回MongoDB原始BSON文档的GET API?
解决BsonDocument查询MongoDB _id的问题
嘿,我懂你的处境——选择MongoDB就是为了灵活的动态结构,不想被C#实体类绑定,结果用BsonDocument的时候卡在了查询单个文档的_id上,对吧?别着急,这其实是因为BsonDocument没有直接暴露Id属性,但我们可以通过MongoDB的原生_id字段来搞定,还有几个小细节要注意,我一步步给你讲:
首先,修复构造函数的小bug
先看你的ManagerService构造函数,你获取了集合但没赋值给_bsondocs变量,这会导致后面调用Find的时候报空引用错误,修正一下:
public ManagerService(IManagersDatabaseSettings settings) { var client = new MongoClient(settings.ConnectionString); var database = client.GetDatabase(settings.DatabaseName); // 这里要把集合赋值给类里的_bsondocs字段! _bsondocs = database.GetCollection<BsonDocument>(settings.ManagersCollectionName); }
方法1:直接通过BsonDocument的索引访问_id
MongoDB里的主键默认存储为_id字段,类型通常是ObjectId,所以我们可以直接用索引访问这个字段,并且把传入的字符串id转换成ObjectId类型(因为直接用字符串匹配ObjectId会失败):
public BsonDocument Get(string id) { try { var objectId = ObjectId.Parse(id); return _bsondocs.Find(doc => doc["_id"] == objectId).FirstOrDefault(); } catch (FormatException) { // 如果传入的id不是合法的ObjectId格式,返回null或者处理错误 return null; } }
方法2:使用FilterDefinition构建查询(更推荐)
用MongoDB驱动的Builders<BsonDocument>.Filter来构建查询条件,代码更清晰,也更容易扩展到复杂查询场景:
public BsonDocument Get(string id) { try { var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse(id)); return _bsondocs.Find(filter).FirstOrDefault(); } catch (FormatException) { return null; } }
额外注意点
- 如果你的MongoDB文档
_id不是默认的ObjectId类型(比如你自定义了字符串id),那只需要去掉ObjectId.Parse(id),直接用传入的字符串匹配就行:var filter = Builders<BsonDocument>.Filter.Eq("_id", id); - 记得处理
ObjectId.Parse可能抛出的FormatException,避免传入非法id导致程序崩溃。
这样修改之后,你的GET接口就能根据id正确查询到BsonDocument了,完全不用绑定固定的C#实体类,完美契合你用MongoDB的初衷~
内容的提问来源于stack exchange,提问作者JohnD91
相关产品推荐
相关产品推荐

