我的数据存储在MongoDB中,如下所示。
_id:5e72196fa7e42815ece552c0
dates: Object
StartDate:2020-06-01T00:00:00.000+00:00
status:"Active"
我的自定义类如下。
public class MyCustomClass
{
public string Status { get; set; }
public DateTime StartDate { get; set; }
}
所以使用下面的代码,我得到了Status,但没有得到Date。
var projection = Builders<Entity>.Projection
.Exclude(x => x.Id)
.Include(x => x.Status)
.Include(x => x.Dates.StartDate);
var data = await _collection.Find(FilterDefination).Project<MyCustomClass>(projection).FirstAsync();
我缺少什么?
首先这种投影是一个集合投影。我不得不把它移到一个 Aggregate
:
dummies.Aggregate().Match(FilterDefinition<Entity>.Empty).Project(...)
甚至没有工作,因为C#驱动没有很好地处理投影。
var projection = new ProjectionDefinitionBuilder<Entity>().Include("$dates.StartDate");
// throws MongoDB.Driver.MongoCommandException: 'Command aggregate failed: Invalid $project :: caused by :: FieldPath field names may not start with '$'..'
var data = dummies.Aggregate().Match(FilterDefinition<Entity>.Empty).Project(projection).FirstAsync().GetAwaiter().GetResult();
最后的结果是使用 BsonDocumentProjectionDefinition
:
string connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
var db = client.GetDatabase("inner");
var dummies = db.GetCollection<Entity>("Dummy");
//dummies.InsertOne(BsonDocument.Parse("{dates: {StartDate: new Date(\"2020-06-01\")}, status: \"Active\"}"));
var projection = new BsonDocumentProjectionDefinition<Entity, MyCustomClass>(BsonDocument.Parse("{\"StartDate\": \"$dates.StartDate\", _id: 0, status: 1}"));
var data = dummies.Aggregate().Match(FilterDefinition).Project(projection).FirstAsync().GetAwaiter().GetResult();