MongoDB LINQ选择具有特定条件的数组元素

时间:2017-05-11 15:21:35

标签: c# mongodb linq aggregation-framework

这是我的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元素的所有部分$projected /简化。

示例:

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"}
]}

应该在具有描述&#34; des2&#34;,&#34; des4&#34;的所有元素上进行投射/减少。和&#34; des5&#34;,以便读取的数据看起来像

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&gt;因此导致编译错误&#34;无法转换为匿名IQueryable<'a&gt;到IQueryable<Part>&#34;插入query作为ObservableCollection<Part>()的构造函数的参数。

如果没有$select,变量不再是匿名的,而是<Part>类,并且编译错误不会发生。显然,$select会更改聚合的类。

如何解决此错误?我的想法是让$project不生成新类,而是重置当前类<Part>的某些字段,但是如何实现呢?

0 个答案:

没有答案