【问题标题】:MongoDB LINQ select array elements with specific conditionsMongoDB LINQ 选择具有特定条件的数组元素
【发布时间】: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&lt;'a&gt; 而不是IAggregateFluent&lt;Part&gt;,这使得query 成为匿名IQueryable&lt;'a> 并因此导致编译错误“无法从匿名@987654332 转换@> 到 IQueryable&lt;Part&gt;" 在插入 query 作为 ObservableCollection&lt;Part&gt;() 的构造函数的参数。

没有$select,变量不再是匿名的,而是&lt;Part&gt; 类的变量,并且不会发生编译错误。显然$select 改变了聚合的类。

如何解决这个错误?我的想法是在不生成新类的情况下制作$project,而是重置当前类&lt;Part&gt;的某些字段,但是如何实现呢?

【问题讨论】:

    标签: c# mongodb linq aggregation-framework


    【解决方案1】:

    您可以在$project 阶段使用$filter 运算符和聚合管道。

    var pipeline = 
          collection.
                Aggregate()
                  .Project(
                     p => new {
                      PartData= p.PartData.Where(d => d.Description == specifiedDescription),
                      SensorData= p.SensorData.Where(s=> s.Description == specifiedDescription)
                }
          );
    

    【讨论】:

    • 感谢您的回答,这就是我要搜索的内容!不幸的是,实现它存在这个问题(见编辑的问题)你知道如何解决它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多