Hello,
I’ve the following data structure:
"settings":
{
_id: ObjectId('636e6724dec4d0de99d1ba25'),
partnerASettings: {
user: 'abcA',
password: 'abcA@123',
baseUri: 'https://abcA.com/v1/api'
},
partnerBSettings: {
user: 'abcB',
password: 'abcB@123',
baseUri: 'https://abcB.com/v1/api'
}
}
And I want to project
only one of “sub-nodes” in C#, like:
db.settings.find({},{"partnerBSettings":1})
{
"_id": {"$oid": "636e6724dec4d0de99d1ba25"},
partnerBSettings: {
user: 'abcB',
password: 'abcB@123',
baseUri: 'https://abcB.com/v1/api'
}
}
C# Model:
public class Settings
{
public PartnerASettings PartnerASettings { get; set; }
public PartnerBSettings PartnerBSettings { get; set; }
}
public class PartnerASettings
{
public string BaseUri { get; set; }
public string User { get; set; }
public string Password { get; set; }
}
public class PartnerBSettings
{
public string BaseUri { get; set; }
public string User { get; set; }
public string Password { get; set; }
}
I have a generic method to try select only the specific model from node document::
TSettings Select<TSettings>()
{
var projection = Builders<Settings>.Projection.Include(/*???*/);
var settings = _settingsCollection
.Find(Builders<Settings>.Filter.Empty)
.Project<TSettings>(projection)
.FirstOrDefault();
return settings;
}
But my doubt is how to .Project<T>
to my “sub model”, like PartnerBSettings.cs
. What Builders<Settings>.Projection
I need? How can I specific it generically?
I wrote a method without “generics” and without specific model at .Project
method:
PartnerBSettings Select()
{
var settings = _settingsCollection
.Find(Builders<Settings>.Filter.Empty)
.Project(p => p.PartnerBSettings)
.FirstOrDefault();
return settings;
}
And I wrote a method specifying model at .Project<PartnerBSettings>
method, but it using BsonDocument
instantiation:
PartnerBSettings Select()
{
var settings = _settings
.Aggregate()
.Unwind("partnerBSettings")
.Find(Builders<Settings>.Filter.Empty)
.Project<PartnerBSettings>(new BsonDocument()
{
{ "User", "$partnerBSettings.user" },
{ "Password", "$partnerBSettings.password" },
{ "BaseUri", "$partnerBSettings.baseUri" },
});
return settings;
}
These above methods works, but I need a generic version. It’s possible make it without “specificate” model property or without instantiating classes “manually”?
Cheers!