【发布时间】:2017-05-11 15:21:34
【问题描述】:
这是我的 MongoDB 数据结构:
public class Part : ICloneable
{
string _id;
ObservableCollection<DataElement> PartData;
ObservableCollection<DataElement> SensorData;
}
public class DataElement: ICloneable
{
string description;
string[] values;
}
使用 Linq,我想读取 SensorData、PartData 和 ResultData 元素上的所有 Parts $projected/reduced 并带有特定描述。
例子:
Part{
_id: id1,
PartData[
{description: "des1", values: "val1"},
{description: "des2", values: "val2"}
],
SensorData[
{description: "des3", values: "val5"},
{description: "des4", values: "val2"},
{description: "des5", values: "val2"}
]}
应该对具有描述“des2”、“des4”和“des5”的所有元素进行投影/减少,以便读取的数据看起来像
Part{
_id: id1,
PartData[
{description: "des2", values: "val2"}
],
SensorData[
{description: "des4", values: "val2"},
{description: "des5", values: "val2"}
]}
每个描述都是唯一的,但并非每个部分都包含所有描述。
在没有任何 $unwind/SelectMany 的情况下,是否有一个简单的解决方案?像
Select(p => p.PartData[] where p.PartData.Description == specifiedDescription),
p => p.SensorData[] where p.SensorData.Description == specifiedDescription))
但包括完整的数组元素,而排除其他元素以及 PartData 和 SensorData?
编辑: 在 Veeram 的回答之后,我尝试实现以下内容:
parts = db.GetCollection<Part>("Part");
var pipeline = parts.Aggregate()
.Project(p => new
{ PartData = p.PartData.Where(d => d.Description == specifiedDescription),
SensorData = p.SensorData.Where(s => s.Description == specifiedDescription)
}) ;
var query = pipeline.ToEnumerable().AsQueryable();
var returnParts = new ObservableCollection<Part>(query);
但这会导致pipeline 成为匿名IAggregateFluent<'a> 而不是IAggregateFluent<Part>,这使得query 成为匿名IQueryable<'a> 并因此导致编译错误“无法从匿名@987654332 转换@> 到 IQueryable<Part>" 在插入 query 作为 ObservableCollection<Part>() 的构造函数的参数。
没有$select,变量不再是匿名的,而是<Part> 类的变量,并且不会发生编译错误。显然$select 改变了聚合的类。
如何解决这个错误?我的想法是在不生成新类的情况下制作$project,而是重置当前类<Part>的某些字段,但是如何实现呢?
【问题讨论】:
标签: c# mongodb linq aggregation-framework