MongoDB 没有像“{ MyProperty : 1 }”这样的魔术字符串的 C# 投影查询

MongoDB C# projection query without magic strings like "{ MyProperty : 1 }"

如果我只想 read/return 属性 MongoDb c# 中的复杂 object/document。我使用这个方法:

public List<T> ReadAllReturnOnlyOneProp<T>(string collection, string nameOfFieldToRead)
{
     var _collection = db.GetCollection<T>(collection);
     return _collection.Find(new BsonDocument()).Project<T>(nameOfFieldToRead).ToList();
}

要调用它,我需要使用:

var test = myMongoAux.ReadAllReturnOnlyOneProp<MyTModel>(myCollectionName, "{MyDBString: 1}");

“{MyDBString: 1}”部分表示我只想从复杂文档中 属性 return 编辑这一部分。 'MyDBString' 将是 object/document 的 属性(:1 => return true)。

我不喜欢我必须使用这个硬编码的字符串。我更习惯做类似..., nameof(MyClass.MyDBString)

如果我重写我的方法,这是一个解决方法吗?:

public List<T> ReadAllReturnOnlyOneProp<T>(string collection, string nameOfFieldToRead)
{
     var magicString = "{" + nameOfFieldToRead + ":"+"1"+ "}"; 
     var _collection = db.GetCollection<T>(collection);
     return _collection.Find(new BsonDocument()).Project<T(magicString).ToList();
}

通过此调用:

var test = myMongoAux.ReadAllReturnOnlyOneProp<MyTModel>(myCollectionName, nameof(MyTModel.MyDBString));

或者这是解决方案?

你可以改成下面的方法,用成员表达式指定你要取回的属性:

public List<T> ReadAllReturnOnlyOneProp<T>(string collection, Expression<Func<T, object>> projection)
{
    var _collection = db.GetCollection<T>(collection);

    return _collection
        .Find(_ => true)
        .Project<T>(Builders<T>.Projection.Include(projection))
        .ToList();
}

像这样调用方法:

var result = ReadAllReturnOnlyOneProp<MyTModel>(myCollectionName, x => x.MyDBString);

还建议您切换到 async/await 模型并停止使用官方驱动程序的遗留同步异步 api,就像您在此处使用的那样。原因见this page