C# 在mongodb中投影时如何保留原始文档?
我想使用mongodb的AggregationFramework和C#驱动程序来创建一个长的聚合管道 不幸的是,我在试图维护管道中的原始记录时遇到了一个奇怪的错误 使用下面的代码,我得到:C# 在mongodb中投影时如何保留原始文档?,c#,mongodb,linq,aggregation-framework,database,C#,Mongodb,Linq,Aggregation Framework,Database,我想使用mongodb的AggregationFramework和C#驱动程序来创建一个长的聚合管道 不幸的是,我在试图维护管道中的原始记录时遇到了一个奇怪的错误 使用下面的代码,我得到: var entry = battleLogs.Aggregate() .Project(x => new { Record = x, // Code works when this line is commented out
var entry = battleLogs.Aggregate()
.Project(x => new
{
Record = x, // Code works when this line is commented out
CSum = x.Player1.Score + x.Player2.Score,
...
})
.First();
我得到这个错误:
System.NotSupportedException: "$project or $group does not support {document}."
我沿着管道计算了许多额外的属性,我需要保留我正在使用的原始记录/文档
我试图将文档的每个成员复制到匿名对象的一个新成员中(使用相同的名称)
这是可行的,但文档(战地日志)有很多字段,因此手动将每个字段复制到一个新的匿名对象将是一项很大的工作,并且在一次只需要几个属性的情况下不必要地污染范围
为什么会发生这种错误?我能做些什么来防止它
编辑:
我要寻找的等价物是原生mongodb脚本中的$addFields
函数。
我需要做的是将所有字段添加到我想要保留的匿名对象中,但是由于根文档中有很多字段,所以我想沿着聚合管道保留原始文档
使用
动态
类型可能有一些技巧?我不熟悉C#驱动程序,但在MongoShell中,您可以使用$$ROOT
作为键。例如:{$project:{record:“$$ROOT”}
我希望它能帮助您在mongoshell中所做的一切,您可以使用c#driver转换它并逐步构造查询文档step@AlexDenisov我认为这是驱动程序中的一个错误,它应该转化为你所说的。。。BRAHIMKamel:我知道这一点,但不幸的是,用BsonDocument语法构造查询非常复杂,而且不太直观。如果可能的话,我想坚持使用fluent api,因为它在其他方面工作得非常好。@Felheart只需给我们提供等效的Mongoquery@BRAHIMKamel这将是{$project:{Player1:1,Player2:1,TimeStamp:1,…}
。这可以通过在新的匿名类型中包含源文档的所有字段来实现,但是对于根级别有许多字段的文档来说,这将是一项艰巨的工作。我看到还有一个$addFields
操作符,它在mongo查询语法中实现了我想要的功能,但是c#驱动程序似乎不使用它。我不熟悉c#驱动程序,但在MongoShell中,您可以使用$$ROOT
作为键。例如:{$project:{record:“$$ROOT”}
我希望它能帮助您在mongoshell中所做的一切,您可以使用c#driver转换它并逐步构造查询文档step@AlexDenisov我认为这是驱动程序中的一个错误,它应该转化为你所说的。。。BRAHIMKamel:我知道这一点,但不幸的是,用BsonDocument语法构造查询非常复杂,而且不太直观。如果可能的话,我想坚持使用fluent api,因为它在其他方面工作得非常好。@Felheart只需给我们提供等效的Mongoquery@BRAHIMKamel这将是{$project:{Player1:1,Player2:1,TimeStamp:1,…}
。这可以通过在新的匿名类型中包含源文档的所有字段来实现,但是对于根级别有许多字段的文档来说,这将是一项艰巨的工作。我看到还有$addFields
操作符,它在mongo查询语法中实现了我想要的功能,但c#驱动程序似乎没有使用它。