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。
如果我只想 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。