MongoDB / C#投影误解

时间:2017-01-09 22:01:57

标签: c# mongodb mongodb-.net-driver

我有以下内容:

var P = Builders<T>.Projection.Include(_ => _.AccountId);
var R = Mongo.Find(E).Project(P).FirstOrDefault();

这是我不明白的地方:

根据该预测,我需要T包括AccountId,但也需要_id。 如果我不包含_id,我会收到以下错误:

{"Element '_id' does not match any field or property of class T."}

如果我尝试排除_id,请执行以下操作:

var P = Builders<T>.Projection.Include(_ => _.AccountId).Exclude(_ => _._id);
var R = Mongo.Find(E).Project(P).FirstOrDefault();

我得到了一个不同的错误:

{"Element 'CreatedOn' does not match any field or property of class T."}

CreatedOn是数据库中记录的另一个字段。

所以,我恐怕我不明白投影是如何运作的: 我需要提取一个字段(AccountId)和其他任何字段(没有_id)等(理想情况下将其映射到字符串而不是仅包含字符串的类,但这是次要问题)

我错过了什么?

我是否理解包含意味着采用空白平板,添加Include语句中指定的所有字段(以及_id由于某种原因),而排除意味着'采取一切'并排除特定领域? 在这种情况下,这两个命令将是独占的。

另外,我可以使用:

Expression(_ => _.AccountId)

在我的预测中,我得到了我想要的结果,但这并没有说明包括/排除

1 个答案:

答案 0 :(得分:0)

该错误表示数据库返回的文档包含字段CreatedOn,该字段在T类中不存在。您需要将该字段添加到类T,如此(假设CreatedOnDateTime

public DateTime CreatedOn { get; set; }