如何使用MondoDB驱动C#从文档中的对象获取值?

问题描述 投票:0回答:1

我的数据存储在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();

我缺少什么?

c# mongodb mongodb-query projection
1个回答
0
投票

首先这种投影是一个集合投影。我不得不把它移到一个 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();
© www.soinside.com 2019 - 2024. All rights reserved.